/* * Copyright (C) 2003-2010 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.container; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.exoplatform.commons.utils.PropertyManager; import org.exoplatform.container.component.BaseComponentPlugin; import org.exoplatform.container.component.ComponentPlugin; import org.exoplatform.container.component.ComponentRequestLifecycle; import org.exoplatform.container.component.RequestLifeCycle; import org.exoplatform.container.configuration.ConfigurationManager; import org.exoplatform.container.context.AdvancedContext; import org.exoplatform.container.context.ContextManager; import org.exoplatform.container.context.DefinitionException; import org.exoplatform.container.jmx.AbstractTestContainer; import org.exoplatform.container.jmx.MX4JComponentAdapter; import org.exoplatform.container.spi.ComponentAdapter; import org.exoplatform.container.spi.DefinitionByName; import org.exoplatform.container.spi.DefinitionByQualifier; import org.exoplatform.container.spi.DefinitionByType; import org.exoplatform.container.util.ContainerUtil; import org.exoplatform.container.xml.InitParams; import org.junit.Test; import org.picocontainer.Disposable; import org.picocontainer.Startable; import java.io.Serializable; import java.lang.annotation.Documented; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.Dependent; import javax.enterprise.context.NormalScope; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.inject.Stereotype; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Provider; import javax.inject.Qualifier; import javax.inject.Scope; import javax.inject.Singleton; import javax.servlet.ServletRequest; import javax.servlet.http.HttpSession; /** * Created by The eXo Platform SAS * Author : Nicolas Filotto * nicolas.filotto@exoplatform.com * 3 mai 2010 */ public class TestExoContainer { public class CachedComponent { public CachedComponent() { } public int hash() { return this.hashCode(); } } @Test public void testHasProfile() { String oldValue = PropertyManager.getProperty(PropertyManager.RUNTIME_PROFILES); try { System.clearProperty(PropertyManager.RUNTIME_PROFILES); PropertyManager.refresh(); assertFalse(ExoContainer.hasProfile(null)); assertFalse(ExoContainer.hasProfile("foo0")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, "foo1"); assertFalse(ExoContainer.hasProfile(null)); assertFalse(ExoContainer.hasProfile("foo0")); assertTrue(ExoContainer.hasProfile("foo1")); System.clearProperty(PropertyManager.RUNTIME_PROFILES); PropertyManager.refresh(); assertFalse(ExoContainer.hasProfile("foo0")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, "foo1, foo2, foo3"); assertFalse(ExoContainer.hasProfile("foo0")); assertTrue(ExoContainer.hasProfile("foo1")); assertTrue(ExoContainer.hasProfile("foo2")); assertTrue(ExoContainer.hasProfile("foo3")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, " \tfoo "); assertFalse(ExoContainer.hasProfile("foo0")); assertTrue(ExoContainer.hasProfile("foo")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, ",foo "); assertFalse(ExoContainer.hasProfile("foo0")); assertTrue(ExoContainer.hasProfile("foo")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, "foo, bar, \t baz \t"); assertFalse(ExoContainer.hasProfile("foo0")); assertTrue(ExoContainer.hasProfile("baz")); PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, "foo1, bar, \t baz1 \t"); assertFalse(ExoContainer.hasProfile("foo0")); assertFalse(ExoContainer.hasProfile("baz")); assertTrue(ExoContainer.hasProfile("bar")); } finally { if (oldValue == null) { System.clearProperty(PropertyManager.RUNTIME_PROFILES); PropertyManager.refresh(); } else { PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES, oldValue); } } } @Test public void testRemoveComponent() throws Exception { ConcurrentContainer container = new ConcurrentContainer(RootContainer.getInstance(), null); container.registerComponentInstance(CachedComponent.class, new CachedComponent()); assertNotNull(container.getComponentInstanceOfType(CachedComponent.class, false)); container.unregisterComponent(CachedComponent.class); assertNull(container.getComponentInstanceOfType(CachedComponent.class, false)); container.registerComponent(new DummyAdapter()); try { container.getComponentInstanceOfType(DummyClass.class, false); fail("A RuntimeException is expected"); } catch (RuntimeException e) { } container.unregisterComponent("testKey"); } @Test public void testContainerLifecyclePlugin() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); assertNotNull(counter); assertEquals(3, counter.init.size()); assertEquals(3, counter.start.size()); container.stop(); assertEquals(3, counter.stop.size()); container.dispose(); assertEquals(3, counter.destroy.size()); // Check order assertTrue(counter.init.get(0) instanceof MyContainerLifecyclePlugin2); MyContainerLifecyclePlugin2 plugin = (MyContainerLifecyclePlugin2)counter.init.get(0); assertNotNull(plugin.getName()); assertNotNull(plugin.getDescription()); assertNotNull(plugin.param); assertTrue(counter.init.get(1) instanceof MyContainerLifecyclePlugin3); assertTrue(counter.init.get(2) instanceof MyContainerLifecyclePlugin1); } @Test public void testStackOverFlow() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); MyClass value = (MyClass)container.getComponentInstanceOfType(MyClass.class); assertNotNull(value); MyClassPlugin plugin = value.plugin_; assertNotNull(plugin); assertNotNull(plugin.cmanager_); assertSame(value, plugin.myClass_); MyClassPlugin2 plugin2 = value.plugin2_; assertNotNull(plugin2); assertNotNull(plugin2.cmanager_); assertSame(value, plugin2.myClass_); } @Test public void testStackOverFlowB() throws Exception { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testStackOverFlowB").build(); final ExoContainer container = PortalContainer.getInstance(); MyClassB value = (MyClassB)container.getComponentInstanceOfType(MyClassB.class); assertNotNull(value); assertTrue(value.started); MyClassPluginB plugin = value.plugin_; assertNotNull(plugin); assertNotNull(plugin.cmanager_); assertSame(value, plugin.myClass_); MyClassPlugin2B plugin2 = value.plugin2_; assertNotNull(plugin2); assertNotNull(plugin2.cmanager_); assertSame(value, plugin2.myClass_); } @Test public void testStackOverFlow2() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); SOE1 soe1 = (SOE1)container.getComponentInstanceOfType(SOE1.class); assertNotNull(soe1); assertEquals(1, soe1.plugins.size()); SOEPlugin soe1Plugin = soe1.plugins.get(0); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); assertSame(soe1, soe1Plugin.soe2.soe1); assertSame(container.getComponentInstanceOfType(SOE2.class), soe1Plugin.soe2); } @Test public void testStackOverFlow3() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); SOE2 soe2 = (SOE2)container.getComponentInstanceOfType(SOE2.class); assertNotNull(soe2); assertNotNull(soe2.soe1); assertEquals(1, soe2.soe1.plugins.size()); SOEPlugin soe1Plugin = soe2.soe1.plugins.get(0); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); assertSame(soe2.soe1, soe1Plugin.soe2.soe1); assertSame(container.getComponentInstanceOfType(SOE1.class), soe2.soe1); } @Test public void testStackOverFlow2B() throws Exception { final URL rootURL = getClass().getResource("test-exo-container.xml"); final URL portalURL = getClass().getResource("test-exo-container-portal-mode.xml"); assertNotNull(rootURL); assertNotNull(portalURL); COUNTER = new AtomicInteger(); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("Case-B").build(); final ExoContainer container = PortalContainer.getInstance(); SOE1B soe1 = (SOE1B)container.getComponentInstanceOfType(SOE1B.class); assertNotNull(soe1); // assertEquals(1, soe1.startOrder); assertTrue(soe1.startOrder >= 1); assertEquals(1, soe1.plugins.size()); SOEPluginB soe1Plugin = soe1.plugins.get(0); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); // assertEquals(2, soe1Plugin.soe2.startOrder); assertTrue(soe1Plugin.soe2.startOrder >= 1); assertSame(soe1, soe1Plugin.soe2.soe1); assertSame(container.getComponentInstanceOfType(SOE2B.class), soe1Plugin.soe2); } @Test public void testStackOverFlow3B() throws Exception { final URL rootURL = getClass().getResource("test-exo-container.xml"); final URL portalURL = getClass().getResource("test-exo-container-portal-mode.xml"); assertNotNull(rootURL); assertNotNull(portalURL); COUNTER = new AtomicInteger(); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("Case-B").build(); final ExoContainer container = PortalContainer.getInstance(); SOE2B soe2 = (SOE2B)container.getComponentInstanceOfType(SOE2B.class); assertNotNull(soe2); // assertEquals(2, soe2.startOrder); assertTrue(soe2.startOrder >= 1); assertNotNull(soe2.soe1); assertEquals(1, soe2.soe1.plugins.size()); SOEPluginB soe1Plugin = soe2.soe1.plugins.get(0); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); assertSame(soe2.soe1, soe1Plugin.soe2.soe1); // assertEquals(1, soe2.soe1.startOrder); assertTrue(soe2.soe1.startOrder >= 1); assertSame(container.getComponentInstanceOfType(SOE1B.class), soe2.soe1); } @Test public void testStackOverFlow2C() throws Exception { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); SOE1C soe1 = (SOE1C)container.getComponentInstanceOfType(SOE1C.class); assertNotNull(soe1); assertEquals(2, soe1.plugins.size()); SOEPluginC soe1Plugin = (SOEPluginC)soe1.plugins.get(1); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); assertSame(soe1, soe1Plugin.soe2.soe1); assertSame(container.getComponentInstanceOfType(SOE2C.class), soe1Plugin.soe2); } @Test public void testStackOverFlow3C() throws Exception { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); SOE2C soe2 = (SOE2C)container.getComponentInstanceOfType(SOE2C.class); assertNotNull(soe2); assertNotNull(soe2.soe1); assertEquals(2, soe2.soe1.plugins.size()); SOEPluginC soe1Plugin = (SOEPluginC)soe2.soe1.plugins.get(1); assertNotNull(soe1Plugin); assertNotNull(soe1Plugin.soe2); assertSame(soe2.soe1, soe1Plugin.soe2.soe1); assertSame(container.getComponentInstanceOfType(SOE1C.class), soe2.soe1); } @Test public void testStackOverFlow4() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testStackOverflowError"); MyService ms = (MyService)container.getComponentInstanceOfType(MyService.class); assertNotNull(ms); assertTrue(ms instanceof MyServiceImpl); MyServiceImpl msi = (MyServiceImpl)ms; assertNotNull(msi.componentPlugin); assertTrue(msi.componentPlugin instanceof MyPlugin); MyPlugin mp = (MyPlugin)msi.componentPlugin; assertSame(mp.svc, ms); } @Test public void testCyclicRef() { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testCyclicRef"); A a = (A)container.getComponentInstanceOfType(A.class); assertNotNull(a); B b = (B)container.getComponentInstanceOfType(B.class); assertNotNull(b); assertSame(a, b.a); } @Test public void testContainerNameSuffix() { final URL rootURL = getClass().getResource("test-exo-container.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); final ExoContainer rContainer = new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testContainerNameSuffix") .build(); final ExoContainer pContainer = PortalContainer.getInstance(); TCNS t1 = rContainer.getComponentInstanceOfType(TCNS.class); assertNotNull(t1); assertEquals("empty${container.name.suffix}", t1.value); assertNotNull(t1.dep); assertEquals("empty${container.name.suffix}", t1.dep.value); TCNS t2 = pContainer.getComponentInstanceOfType(TCNS.class); assertNotNull(t2); assertEquals("empty_portal", t2.value); assertNotNull(t2.dep); assertEquals("empty_portal", t2.dep.value); } public static class TCNS implements Startable { public String value; public TCNS_DEP dep; public TCNS(InitParams params, TCNS_DEP dep) { this.dep = dep; this.value = params.getValueParam("param").getValue(); } /** * @see org.picocontainer.Startable#start() */ public void start() { } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TCNS_DEP implements Startable { public String value; public TCNS_DEP(InitParams params) { this.value = params.getValueParam("param").getValue(); } /** * @see org.picocontainer.Startable#start() */ public void start() { } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Test public void testStartOrder() { testStartOrder(false); } protected void testStartOrder(boolean checkC0NC1) { COUNTER = new AtomicInteger(); final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testStartOrder"); C0 c0 = (C0)container.getComponentInstanceOfType(C0.class); assertNotNull(c0); assertTrue(c0.startOrder > 0); C1 c1 = (C1)container.getComponentInstanceOfType(C1.class); assertNotNull(c1); assertTrue(c1.startOrder > 0); if (checkC0NC1) assertTrue(c1.startOrder < c0.startOrder); C2 c2 = (C2)container.getComponentInstanceOfType(C2.class); assertNotNull(c2); assertTrue(c2.startOrder > 0); C2_1 c2_1 = container.getComponentInstanceOfType(C2_1.class); assertNotNull(c2_1); assertTrue(c2_1.startOrder > 0); C2_2 c2_2 = container.getComponentInstanceOfType(C2_2.class); assertNotNull(c2_2); assertTrue(c2_2.startOrder > 0); C2_3 c2_3 = container.getComponentInstanceOfType(C2_3.class); assertNotNull(c2_3); assertTrue(c2_3.startOrder > 0); C2_4 c2_4 = container.getComponentInstanceOfType(C2_4.class); assertNotNull(c2_4); assertTrue(c2_4.startOrder > 0); assertSame(c2_1.getC2(), c2_2); assertSame(c2_1.getC3(), c2_3); assertSame(c2_1.getC4(), c2_4); assertSame(c2_2.c3, c2_3); assertSame(c2_2.c4, c2_4); assertSame(c2_3.c4, c2_4); assertTrue(c2_4.startOrder < c2_1.startOrder); assertTrue(c2_4.startOrder < c2_2.startOrder); assertTrue(c2_4.startOrder < c2_3.startOrder); assertTrue(c2_3.startOrder < c2_1.startOrder); assertTrue(c2_3.startOrder < c2_2.startOrder); assertTrue(c2_2.startOrder < c2_1.startOrder); } @Test public void testStartOrder2() { COUNTER = new AtomicInteger(); ExoContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testStartOrder2"); TSO2_A a = container.getComponentInstanceOfType(TSO2_A.class); assertNotNull(a); TSO2_B b = container.getComponentInstanceOfType(TSO2_B.class); assertNotNull(b); TSO2_C c = container.getComponentInstanceOfType(TSO2_C.class); assertNotNull(c); TSO2_D d = container.getComponentInstanceOfType(TSO2_D.class); assertNotNull(d); assertTrue(a.startOrder > 0); assertTrue(c.startOrder > 0); assertTrue(d.startOrder > 0); assertTrue(c.startOrder < a.startOrder); assertTrue(d.startOrder < a.startOrder); assertTrue(c.startOrder < d.startOrder); TSO2_A2 a2 = container.getComponentInstanceOfType(TSO2_A2.class); assertNotNull(a2); TSO2_B2 b2 = container.getComponentInstanceOfType(TSO2_B2.class); assertNotNull(b2); TSO2_C2 c2 = container.getComponentInstanceOfType(TSO2_C2.class); assertNotNull(c2); assertTrue(a2.startOrder > 0); assertTrue(b2.startOrder > 0); assertTrue(c2.startOrder > 0); assertTrue(c2.startOrder < b2.startOrder); assertTrue(b2.startOrder < a2.startOrder); } public static class TSO2_A implements Startable { public int startOrder; public TSO2_A(TSO2_B b) { } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TSO2_B { public TSO2_B(TSO2_C c, TSO2_D d) { } } public static class TSO2_C implements Startable { public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TSO2_D implements Startable { public int startOrder; public TSO2_D(TSO2_C c) { } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TSO2_A2 implements Startable { public int startOrder; private ExoContainerContext ctx; public TSO2_A2(TSO2_B2 b, ExoContainerContext ctx) { this.ctx = ctx; } /** * @see org.picocontainer.Startable#start() */ public void start() { try { RequestLifeCycle.begin(ctx.getContainer()); startOrder = COUNTER.incrementAndGet(); } finally { RequestLifeCycle.end(); } } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TSO2_B2 implements Startable, ComponentRequestLifecycle { public int startOrder; public TSO2_C2 c; public TSO2_B2(TSO2_C2 c) { this.c = c; } /** * @see org.picocontainer.Startable#start() */ public void start() { try { RequestLifeCycle.begin(this); startOrder = COUNTER.incrementAndGet(); } finally { RequestLifeCycle.end(); } } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } /** * @see org.exoplatform.container.component.ComponentRequestLifecycle#startRequest(org.exoplatform.container.ExoContainer) */ public void startRequest(ExoContainer container) { if (c.startOrder == 0) throw new IllegalStateException("TSO2_C2 should be started"); } /** * @see org.exoplatform.container.component.ComponentRequestLifecycle#endRequest(org.exoplatform.container.ExoContainer) */ public void endRequest(ExoContainer container) { } } public static class TSO2_C2 implements Startable { public int startOrder; public TSO2_C2() { } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Test public void testStartOrder3() { COUNTER = new AtomicInteger(); ExoContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testStartOrder3"); TSO3_A a = container.getComponentInstanceOfType(TSO3_A.class); assertNotNull(a); TSO3_B b = container.getComponentInstanceOfType(TSO3_B.class); assertNotNull(b); TSO3_C c = container.getComponentInstanceOfType(TSO3_C.class); assertNotNull(c); assertTrue(a.startOrder > 0); assertTrue(b.startOrder > 0); assertTrue(c.startOrder > 0); assertTrue(c.startOrder < b.startOrder); assertTrue(b.startOrder < a.startOrder); } @Singleton public static class TSO3_A implements Startable { public int startOrder; @Inject public TSO3_A(TSO3_B b) { } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Singleton public static class TSO3_B implements Startable { public int startOrder; @Inject public TSO3_B(TSO3_C c) { } @Inject public void setB(TSO3_B b) { } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class TSO3_C implements Startable { public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Test public void testCache() { URL rootURL = getClass().getResource("test-exo-container.xml"); URL portalURL = getClass().getResource("empty-config.xml"); assertNotNull(rootURL); assertNotNull(portalURL); // new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).build(); RootContainer container = RootContainer.getInstance(); Object value = new MyClass(); ComponentAdapter<?> ca = container.registerComponentInstance("MyKey", value); PortalContainer pcontainer = PortalContainer.getInstance(); assertSame(ca, container.getComponentAdapter("MyKey")); assertSame(ca, pcontainer.getComponentAdapter("MyKey")); assertSame(ca, container.getComponentAdapter("MyKey", MyClass.class)); assertSame(ca, pcontainer.getComponentAdapter("MyKey", MyClass.class)); try { container.getComponentAdapter("MyKey", String.class); fail("A ClassCastException was expected"); } catch (ClassCastException e) { // ok } try { pcontainer.getComponentAdapter("MyKey", String.class); fail("A ClassCastException was expected"); } catch (ClassCastException e) { // ok } assertSame(value, container.getComponentInstance("MyKey")); assertSame(value, pcontainer.getComponentInstance("MyKey")); assertSame(value, container.getComponentInstance("MyKey", MyClass.class)); assertSame(value, pcontainer.getComponentInstance("MyKey", MyClass.class)); try { container.getComponentInstance("MyKey", String.class); fail("A ClassCastException was expected"); } catch (ClassCastException e) { // ok } try { pcontainer.getComponentInstance("MyKey", String.class); fail("A ClassCastException was expected"); } catch (ClassCastException e) { // ok } container.unregisterComponent("MyKey"); assertNull(container.getComponentAdapter("MyKey")); assertNull(pcontainer.getComponentAdapter("MyKey")); assertNull(container.getComponentAdapter("MyKey", MyClass.class)); assertNull(pcontainer.getComponentAdapter("MyKey", MyClass.class)); assertNull(container.getComponentAdapter("MyKey", String.class)); assertNull(pcontainer.getComponentAdapter("MyKey", String.class)); assertNull(container.getComponentInstance("MyKey")); assertNull(pcontainer.getComponentInstance("MyKey")); assertNull(container.getComponentInstance("MyKey", MyClass.class)); assertNull(pcontainer.getComponentInstance("MyKey", MyClass.class)); assertNull(container.getComponentInstance("MyKey", String.class)); assertNull(pcontainer.getComponentInstance("MyKey", String.class)); } @Test public void testStart() { URL rootURL = getClass().getResource("test-exo-container.xml"); URL portalURL = getClass().getResource("empty-config.xml"); assertNotNull(rootURL); assertNotNull(portalURL); // new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testStart").build(); RootContainer container = RootContainer.getInstance(); PortalContainer pcontainer = PortalContainer.getInstance(); container.stop(); container.dispose(); assertNotNull(container.getComponentInstanceOfType(TS1.class)); assertNotNull(container.getComponentInstanceOfType(TS2.class)); assertNotNull(container.getComponentInstanceOfType(TS3.class)); assertNotNull(container.getComponentInstanceOfType(TS4.class)); assertNotNull(pcontainer.getComponentInstanceOfType(TS1.class)); assertNotNull(pcontainer.getComponentInstanceOfType(TS2.class)); assertNotNull(pcontainer.getComponentInstanceOfType(TS3.class)); assertNotNull(pcontainer.getComponentInstanceOfType(TS4.class)); TS1 ts1rc = container.getComponentInstanceOfType(TS1.class); TS1 ts1pc = pcontainer.getComponentInstanceOfType(TS1.class); assertSame(ts1rc, ts1pc); assertEquals(1, ts1pc.started); assertEquals(1, ts1pc.stopped); TS2 ts2rc = container.getComponentInstanceOfType(TS2.class); TS2 ts2pc = pcontainer.getComponentInstanceOfType(TS2.class); assertSame(ts2rc, ts2pc); assertEquals(1, ts2rc.disposed); TS3 ts3rc = container.getComponentInstanceOfType(TS3.class); TS3 ts3pc = pcontainer.getComponentInstanceOfType(TS3.class); assertNotSame(ts3rc, ts3pc); assertEquals(1, ts3rc.started); assertEquals(1, ts3pc.started); assertEquals(1, ts3rc.stopped); assertEquals(1, ts3pc.stopped); TS4 ts4rc = container.getComponentInstanceOfType(TS4.class); TS4 ts4pc = pcontainer.getComponentInstanceOfType(TS4.class); assertNotSame(ts4rc, ts4pc); assertEquals(1, ts4rc.disposed); assertEquals(1, ts4pc.disposed); } public static class MyMTClass { public MyMTClass() throws InterruptedException { // Make the thread wait to ensure that the thread safety issue is properly solved Thread.sleep(10); } } public static class MyClass { public MyClassPlugin plugin_; public MyClassPlugin2 plugin2_; public void add(MyClassPlugin plugin) { this.plugin_ = plugin; } public void add(MyClassPlugin2 plugin) { this.plugin2_ = plugin; } } public static class MyClassPlugin extends BaseComponentPlugin { public ConfigurationManager cmanager_; public MyClass myClass_; public MyClassPlugin(ConfigurationManager cmanager, MyClass myClass) { this.cmanager_ = cmanager; this.myClass_ = myClass; } } public static class MyClassPlugin2 extends BaseComponentPlugin { public ConfigurationManager cmanager_; public MyClass myClass_; public MyClassPlugin2(ConfigurationManager cmanager) { this.cmanager_ = cmanager; this.myClass_ = (MyClass)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(MyClass.class); } } public static class MyClassB implements Startable { public MyClassPluginB plugin_; public MyClassPlugin2B plugin2_; public boolean started; public void add(MyClassPluginB plugin) { this.plugin_ = plugin; } public void add(MyClassPlugin2B plugin) { this.plugin2_ = plugin; } public void start() { started = true; } public void stop() { } } public static class MyClassPluginB extends BaseComponentPlugin { public ConfigurationManager cmanager_; public MyClassB myClass_; public MyClassPluginB(ConfigurationManager cmanager, MyClassB myClass) { this.cmanager_ = cmanager; this.myClass_ = myClass; } } public static class MyClassPlugin2B extends BaseComponentPlugin { public ConfigurationManager cmanager_; public MyClassB myClass_; public MyClassPlugin2B(ConfigurationManager cmanager) { this.cmanager_ = cmanager; this.myClass_ = (MyClassB)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(MyClassB.class); } } public static class MyCounter { public final List<BaseContainerLifecyclePlugin> init = new ArrayList<BaseContainerLifecyclePlugin>(); public final List<BaseContainerLifecyclePlugin> start = new ArrayList<BaseContainerLifecyclePlugin>(); public final List<BaseContainerLifecyclePlugin> stop = new ArrayList<BaseContainerLifecyclePlugin>(); public final List<BaseContainerLifecyclePlugin> destroy = new ArrayList<BaseContainerLifecyclePlugin>(); } public static class MyContainerLifecyclePlugin1 extends BaseContainerLifecyclePlugin { public MyContainerLifecyclePlugin1() { } @Override public void destroyContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.destroy.add(this); } } @Override public void initContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.init.add(this); } } @Override public void startContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.start.add(this); } } @Override public void stopContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.stop.add(this); } } } public static class MyContainerLifecyclePlugin2 extends BaseContainerLifecyclePlugin { public final String param; public MyContainerLifecyclePlugin2(InitParams params) { this.param = params != null ? params.getValueParam("param").getValue() : null; } @Override public void destroyContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.destroy.add(this); } } @Override public void initContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.init.add(this); } } @Override public void startContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.start.add(this); } } @Override public void stopContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.stop.add(this); } } } public static class MyContainerLifecyclePlugin3 extends BaseContainerLifecyclePlugin { public MyContainerLifecyclePlugin3() { } @Override public void destroyContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.destroy.add(this); } } @Override public void initContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.init.add(this); } } @Override public void startContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.start.add(this); } } @Override public void stopContainer(ExoContainer container) throws Exception { MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class); if (counter != null) { counter.stop.add(this); } } } public static class A1 { public B1 b; public A1(B1 b) { this.b = b; } } public static class B1 { public A1 a; public B1(A1 a) { this.a = a; } } public static class A2 implements Startable { public B2 b; public A2(B2 b) { this.b = b; } public void start() { } public void stop() { } } public static class B2 { public A2 a; public B2(A2 a) { this.a = a; } } public static class A { public B b; public A(B b) { this.b = b; } } public static class BPlugin extends BaseComponentPlugin { public A a; public BPlugin(A a) { this.a = a; } } public static class B { public A a; public BPlugin plugin_; public void add(BPlugin plugin) { this.plugin_ = plugin; this.a = plugin.a; } } private class DummyAdapter implements ComponentAdapter<DummyClass> { public Object getComponentKey() { return "testKey"; } public DummyClass getComponentInstance() { // Used to check a situation when RunTimeException occurs while retrieving an instance. // This reproduces usecase from JCR-1565 throw new RuntimeException(); } public Class<DummyClass> getComponentImplementation() { return DummyClass.class; } public boolean isSingleton() { return true; } } public static class DummyClass { } public static AtomicInteger COUNTER; public static class C0 implements Startable { public int startOrder; C1 c1; public C0(C1 c1) { this.c1 = c1; } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } public static class C1 implements Startable { public int startOrder; P p; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } public void add(P p) { this.p = p; } } public static class P extends BaseComponentPlugin { public C0 c0; public C1 c1; public C2 c2; public P(C0 c0, C1 c1, C2 c2) { this.c0 = c0; this.c1 = c1; this.c2 = c2; } } public static class C2 implements Startable { public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Singleton public static class C2_1 implements Startable { @Inject public C2_2 c2; @Inject protected C2_3 c3; @Inject private C2_4 c4; public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } /** * @return the c2 */ public C2_2 getC2() { return c2; } /** * @return the c3 */ public C2_3 getC3() { return c3; } /** * @return the c4 */ public C2_4 getC4() { return c4; } } @Singleton public static class C2_2 implements Startable { public C2_3 c3; public C2_4 c4; public int startOrder; @Inject public C2_2(C2_4 c4, C2_3 c3) { this.c3 = c3; this.c4 = c4; } /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Singleton public static class C2_3 implements Startable { public C2_4 c4; public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } @Inject public void setC4(C2_4 c4) { this.c4 = c4; } } @Singleton public static class C2_4 implements Startable { public int startOrder; /** * @see org.picocontainer.Startable#start() */ public void start() { startOrder = COUNTER.incrementAndGet(); } /** * @see org.picocontainer.Startable#stop() */ public void stop() { } } @Test public void testLifeCycle() throws Throwable { ExoContainer container = new ExoContainer(); assertTrue(container.canBeStarted()); assertFalse(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.registerComponentImplementation(LC1.class, LC1.class); container.registerComponentImplementation(LC2.class, LC2.class); container.registerComponentImplementation(LC3.class, LC3.class); container.registerComponentImplementation(LC4.class, LC4.class); container.registerComponentImplementation(LC5.class, LC5.class); try { container.start(); fail("Should fail due to the start method of C1"); } catch (Exception e) { // ignore me } LC1 c1 = (LC1)container.getComponentInstanceOfType(LC1.class); LC2 c2 = (LC2)container.getComponentInstanceOfType(LC2.class); LC3 c3 = (LC3)container.getComponentInstanceOfType(LC3.class); LC4 c4 = (LC4)container.getComponentInstanceOfType(LC4.class); LC5 c5 = (LC5)container.getComponentInstanceOfType(LC5.class); assertTrue(container.canBeStarted()); assertFalse(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.stop(); assertTrue(container.canBeStarted()); assertFalse(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.dispose(); assertTrue(c1.disposed && c2.disposed && c5.disposed); assertFalse(container.canBeStarted()); assertFalse(container.canBeStopped()); assertFalse(container.canBeDisposed()); container = new ExoContainer(); assertTrue(container.canBeStarted()); assertFalse(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.registerComponentImplementation(LC2.class, LC2.class); container.registerComponentImplementation(LC3.class, LC3.class); container.registerComponentImplementation(LC4.class, LC4.class); container.registerComponentImplementation(LC5.class, LC5.class); container.start(); c2 = (LC2)container.getComponentInstanceOfType(LC2.class); c3 = (LC3)container.getComponentInstanceOfType(LC3.class); c4 = (LC4)container.getComponentInstanceOfType(LC4.class); assertTrue(c2.started && c3.started && c4.started); assertFalse(container.canBeStarted()); assertTrue(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.stop(); assertTrue(container.canBeStarted()); assertFalse(container.canBeStopped()); assertTrue(container.canBeDisposed()); container.dispose(); assertTrue(c1.disposed && c2.disposed && c5.disposed); assertFalse(container.canBeStarted()); assertFalse(container.canBeStopped()); assertFalse(container.canBeDisposed()); } public static class LC1 implements Startable, Disposable { public boolean started; public boolean stopped; public boolean disposed; public void start() { throw new RuntimeException(); } public void stop() { stopped = true; } public void dispose() { disposed = true; } } public static class LC2 implements Startable, Disposable { public boolean started; public boolean stopped; public boolean disposed; public void start() { started = true; } public void stop() { throw new RuntimeException(); } public void dispose() { disposed = true; } } public static class LC3 implements Startable, Disposable { public boolean started; public boolean stopped; public boolean disposed; public void start() { started = true; } public void stop() { stopped = true; } public void dispose() { throw new RuntimeException(); } } public static class LC4 implements Startable { public boolean started; public boolean stopped; public void start() { started = true; } public void stop() { stopped = true; } } public static class LC5 implements Disposable { public boolean disposed; public void dispose() { disposed = true; } } public static class SOE1 { public List<SOEPlugin> plugins = new ArrayList<SOEPlugin>(); public void addPlugin(SOEPlugin plugin) { plugins.add(plugin); } } public static class SOEPlugin extends BaseComponentPlugin { public SOE2 soe2; public SOEPlugin(SOE2 soe2) { this.soe2 = soe2; } } public static class SOE2 { public SOE1 soe1; public SOE2() { this.soe1 = (SOE1)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(SOE1.class); } } public static class SOE1B implements Startable { public List<SOEPluginB> plugins = new ArrayList<SOEPluginB>(); public int startOrder; public void addPlugin(SOEPluginB plugin) { plugins.add(plugin); } public void start() { startOrder = COUNTER.incrementAndGet(); } public void stop() { } } public static class SOEPluginB extends BaseComponentPlugin { public SOE2B soe2; public SOEPluginB(SOE2B soe2) { this.soe2 = soe2; } } public static class SOE2B implements Startable { public SOE1B soe1; public int startOrder; public SOE2B() { this.soe1 = (SOE1B)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(SOE1B.class); } public void start() { startOrder = COUNTER.incrementAndGet(); } public void stop() { } } public static class SOE1C { public List<SOEPluginCR> plugins = new ArrayList<SOEPluginCR>(); public void addPlugin(SOEPluginCR plugin) { plugins.add(plugin); } } public static class SOEPluginCR extends BaseComponentPlugin { public SOEPluginCR() { } } public static class SOEPluginC extends SOEPluginCR { public SOE2C soe2; public SOEPluginC() { this.soe2 = (SOE2C)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(SOE2C.class); } } public static class SOE2C { public SOE1C soe1; public SOE2C(SOE1C soe1) { this.soe1 = soe1; } } public static class MyPlugin extends BaseComponentPlugin { MySpecialService svc; public MyPlugin(MySpecialService svc) { this.svc = svc; } } public static interface MyService { public void addPlugin(ComponentPlugin componentPlugin); } public static interface MySpecialService extends MyService { } public static class MyServiceImpl implements MySpecialService, Startable { ComponentPlugin componentPlugin; public MyServiceImpl() { } public void addPlugin(ComponentPlugin componentPlugin) { this.componentPlugin = componentPlugin; } public void stop() { } public void start() { } } public static class TS1 implements Startable { public int started; public int stopped; public void start() { ++started; } public void stop() { ++stopped; } } public static class TS2 implements Disposable { public int disposed; public void dispose() { ++disposed; } } public static class TS3 implements Startable { public int started; public int stopped; public void start() { ++started; } public void stop() { ++stopped; } } public static class TS4 implements Disposable { public int disposed; public void dispose() { ++disposed; } } @Test public void testStates() throws Exception { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testStates"); TSC1 value = (TSC1)container.getComponentInstanceOfType(TSC1.class); assertNotNull(value); TSC2Plugin plugin = value.plugin; assertNotNull(plugin); assertNotNull(plugin.tsc2); assertNotNull(plugin.tsc2.plugin); TSC2 value2 = (TSC2)container.getComponentInstanceOfType(TSC2.class); assertNotNull(value2); assertSame(value2, plugin.tsc2); TSC2Plugin plugin2 = value2.plugin; assertNotNull(plugin2); assertNotNull(plugin2.tsc2); assertSame(value2, plugin2.tsc2); assertSame(plugin.tsc2.plugin, plugin2); } public static class TSC1 { TSC2Plugin plugin; public void addPlugin(TSC2Plugin plugin) { this.plugin = plugin; } } public static class TSC2 { TSC2Plugin plugin; public void addPlugin(TSC2Plugin plugin) { this.plugin = plugin; } } public static class TSC2Plugin extends BaseComponentPlugin { TSC2 tsc2; public TSC2Plugin(TSC2 tsc2) { this.tsc2 = tsc2; } } private static ExoContainer parent; @Test public void testContainerOwner() throws Exception { try { parent = new ExoContainer(); parent.registerComponentImplementation(ContainerOwner.class); parent.start(); } finally { parent = null; } } public static class ContainerOwner implements Startable { ExoContainer container; public void start() { container = new ExoContainer(parent); parent.registerComponentInstance("TestContainerOwner", container); container.registerComponentImplementation(ContainerOwnerHolder.class); container.start(); } public void stop() { } } public static class ContainerOwnerHolder implements Startable { ContainerOwner co; public ContainerOwnerHolder(ContainerOwner co) { this.co = co; } public void start() { } public void stop() { } } @Test public void testContainers() throws Exception { final URL rootURL = getClass().getResource("test-exo-container.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); // new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testContainers").build(); ExoContainer container = PortalContainer.getInstance(); CCTC1 c1 = (CCTC1)container.getComponentInstanceOfType(CCTC1.class); assertNotNull(c1); assertNotNull(c1.container); assertNotNull(c1.c2); assertNotNull(c1.c2.container); assertNotNull(c1.c3); assertNotNull(c1.c3.container); assertSame(c1.container, c1.c2.container); assertSame(c1.container, c1.c3.container); assertSame(container, c1.container); } public static class CCTC1 { public ExoContainer container; public CCTC2 c2; public CCTC3 c3; public CCTC1(CCTC2 c2, CCTC3 c3) { this.container = ExoContainerContext.getCurrentContainer(); this.c2 = c2; this.c3 = c3; } } public static class CCTC2 { public ExoContainer container; public CCTC2() { this.container = ExoContainerContext.getCurrentContainer(); } } public static class CCTC3 { public ExoContainer container; public CCTC3() { this.container = ExoContainerContext.getCurrentContainer(); } } public static class SortedConstructorsA { public SortedConstructorsA(String a, String b, String c) {} public SortedConstructorsA(String a, String b) {} public SortedConstructorsA(String a) {} } public static class SortedConstructorsB { public SortedConstructorsB(String a, String b, String c) {} public SortedConstructorsB(String a) {} public SortedConstructorsB(String a, String b) {} } public static class SortedConstructorsC { public SortedConstructorsC(String a, String b) {} public SortedConstructorsC(String a) {} public SortedConstructorsC(String a, String b, String c) {} } public static class SortedConstructorsD { public SortedConstructorsD(String a, String b) {} public SortedConstructorsD(String a, String b, String c) {} public SortedConstructorsD(String a) {} } public static class SortedConstructorsE { public SortedConstructorsE(String a) {} public SortedConstructorsE(String a, String b, String c) {} public SortedConstructorsE(String a, String b) {} } public static class SortedConstructorsF { public SortedConstructorsF(String a) {} public SortedConstructorsF(String a, String b) {} public SortedConstructorsF(String a, String b, String c) {} } @Test public void testSortedConstructors() { testSortedConstructors(SortedConstructorsA.class); testSortedConstructors(SortedConstructorsB.class); testSortedConstructors(SortedConstructorsC.class); testSortedConstructors(SortedConstructorsD.class); testSortedConstructors(SortedConstructorsE.class); testSortedConstructors(SortedConstructorsF.class); } private void testSortedConstructors(Class<?> c) { Constructor<?>[] constructors = ContainerUtil.getSortedConstructors(c); assertEquals(3, constructors.length); assertEquals(3, constructors[0].getParameterTypes().length); assertEquals(2, constructors[1].getParameterTypes().length); assertEquals(1, constructors[2].getParameterTypes().length); } @Test public void testJSR330() throws Exception { RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "empty-config.xml"); container.registerComponentImplementation(JSR330_A.class); container.registerComponentImplementation(JSR330_B.class); container.registerComponentImplementation(JSR330_C.class); container.registerComponentImplementation(JSR330_C2.class); container.registerComponentImplementation(JSR330_C3.class); container.registerComponentImplementation(JSR330_C4.class); container.registerComponentImplementation(JSR330_C5.class); container.registerComponentImplementation(JSR330_C6.class); container.registerComponentImplementation(JSR330_D.class); container.registerComponentImplementation(JSR330_P1.class); container.registerComponentImplementation(JSR330_P2.class); container.registerComponentImplementation(JSR330_P3.class); container.registerComponentImplementation(JSR330_P4.class); container.registerComponentImplementation(N1.class, JSR330_N1.class); container.registerComponentImplementation("n2", JSR330_N2.class); JSR330_A a = container.getComponentInstanceOfType(JSR330_A.class); assertNotNull(a); JSR330_P1 p1 = container.getComponentInstanceOfType(JSR330_P1.class); assertNotNull(p1); JSR330_P2 p2 = container.getComponentInstanceOfType(JSR330_P2.class); assertNotNull(p2); JSR330_B b = container.getComponentInstanceOfType(JSR330_B.class); assertNotNull(b); assertSame(a, b.a); assertSame(a, b.a2); assertSame(a, b.a3); assertSame(a, b.a4); assertSame(a, b.getA5()); assertNull(b.a6); assertNull(JSR330_B.a7); assertNotNull(b.p1); assertNotNull(b.n); assertTrue(b.n instanceof JSR330_N2); assertNotNull(b.n2); assertTrue(b.n2 instanceof JSR330_N1); assertSame(container.getComponentInstanceOfType(JSR330_P1.class), b.p1.get()); JSR330_C c = container.getComponentInstanceOfType(JSR330_C.class); assertNotNull(c); assertNotSame(c, container.getComponentInstanceOfType(JSR330_C.class)); assertSame(a, c.a); assertNotNull(c.p2); assertNotNull(c.n); assertTrue(c.n instanceof JSR330_N2); assertNotNull(c.n2); assertTrue(c.n2 instanceof JSR330_N1); assertNotSame(container.getComponentInstanceOfType(JSR330_P2.class), c.p2.get()); JSR330_C2 c2 = container.getComponentInstanceOfType(JSR330_C2.class); assertNotNull(c2); assertSame(a, c2.a); JSR330_C3 c3 = container.getComponentInstanceOfType(JSR330_C3.class); assertNotNull(c3); assertSame(a, c3.a); JSR330_C4 c4 = container.getComponentInstanceOfType(JSR330_C4.class); assertNotNull(c4); assertSame(a, c4.a); try { container.getComponentInstanceOfType(JSR330_C5.class); fail("A Runtime Exception was expected"); } catch (RuntimeException e) { // OK } try { container.getComponentInstanceOfType(JSR330_C6.class); fail("A Runtime Exception was expected"); } catch (RuntimeException e) { // OK } JSR330_D d = container.getComponentInstanceOfType(JSR330_D.class); assertNotNull(d); assertSame(a, d.a); assertSame(a, d.a2); assertSame(a, d.a3); assertSame(a, d.a4); assertSame(a, d.a5); assertEquals(1, d.calledInit); assertEquals(2, d.calledInit2); assertNotNull(d.p3); assertNotNull(d.n); assertTrue(d.n instanceof JSR330_N2); assertNotNull(d.n2); assertTrue(d.n2 instanceof JSR330_N1); assertSame(container.getComponentInstanceOfType(JSR330_P3.class), d.p3.get()); assertNotNull(d.p4); try { d.p4.get(); fail("A Runtime Exception was expected"); } catch (RuntimeException e) { // ok } JSR330_N2 n2 = container.getComponentInstanceOfType(JSR330_N2.class); assertNotNull(n2); assertNotSame(n2, container.getComponentInstanceOfType(JSR330_N2.class)); JSR330_N2 n2_2 = container.getComponentInstance("n2", JSR330_N2.class); assertNotNull(n2_2); assertNotSame(n2_2, n2); assertNotSame(n2_2, container.getComponentInstance("n2", JSR330_N2.class)); List<JSR330_N2> allN2 = container.getComponentInstancesOfType(JSR330_N2.class); assertNotNull(allN2); assertEquals(1, allN2.size()); JSR330_N2 n2_3 = allN2.get(0); assertNotSame(n2_3, n2); assertNotSame(n2_3, n2_2); allN2 = container.getComponentInstancesOfType(JSR330_N2.class); assertNotNull(allN2); assertEquals(1, allN2.size()); assertNotSame(n2_3, allN2.get(0)); assertTrue(ContainerUtil.isSingleton(JSR330_A.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N.class)); assertTrue(ContainerUtil.isSingleton(JSR330_P3.class)); assertFalse(ContainerUtil.isSingleton(JSR330_N2.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N2_2.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N2_3.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N2_4.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N2_5.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N2_6.class)); assertFalse(ContainerUtil.isSingleton(JSR330_N7.class)); assertFalse(ContainerUtil.isSingleton(JSR330_N7_2.class)); assertFalse(ContainerUtil.isSingleton(JSR330_N8.class)); assertFalse(ContainerUtil.isSingleton(JSR330_N8_2.class)); assertTrue(ContainerUtil.isSingleton(JSR330_N8_3.class)); } public static class JSR330_A { } public static class JSR330_B extends JSR330_B1 { @Inject private JSR330_A a; @Inject protected JSR330_A a2; @Inject public JSR330_A a3; @Inject JSR330_A a4; @Inject private final JSR330_A a6 = null; @Inject private static JSR330_A a7; @Inject private Provider<JSR330_P1> p1; @SuppressWarnings("unused") @Inject private int value; @Inject @Named("n2") private JSR330_N n; @Inject @N1 private JSR330_N n2; } public static class JSR330_B1 { @Inject private JSR330_A a5; protected JSR330_A getA5() { return a5; } } public static class JSR330_C { private final JSR330_A a; private final Provider<JSR330_P2> p2; private final JSR330_N n; private final JSR330_N n2; @Inject public JSR330_C(JSR330_A a, Provider<JSR330_P2> p2, @Named("n2") JSR330_N n, @N1 JSR330_N n2) { this.a = a; this.p2 = p2; this.n = n; this.n2 = n2; } /** * Bad constructor */ public JSR330_C(JSR330_A a, JSR330_B b, Provider<JSR330_P2> p2, JSR330_N n, JSR330_N n2) { this.a = null; this.p2 = null; this.n = null; this.n2 = null; } } public static class JSR330_C2 { private final JSR330_A a; @Inject protected JSR330_C2(JSR330_A a) { this.a = a; } } public static class JSR330_C3 { private final JSR330_A a; @Inject private JSR330_C3(JSR330_A a) { this.a = a; } } public static class JSR330_C4 { private final JSR330_A a; @Inject JSR330_C4(JSR330_A a) { this.a = a; } } public static class JSR330_C5 { @Inject JSR330_C5(int value) { } } public static class JSR330_C6 { JSR330_C6() { } } public static class JSR330_D extends JSR330_D1 { private JSR330_A a; private JSR330_A a2; private JSR330_A a3; private JSR330_A a4; private Provider<JSR330_P3> p3; @Inject private Provider<JSR330_P4> p4; @SuppressWarnings("unused") private int value; private int calledInit; private JSR330_N n; private JSR330_N n2; @Inject public void setA(JSR330_A a) { this.a = a; } @Inject private void setA2(JSR330_A a) { this.a2 = a; } @Inject protected void setA3(JSR330_A a) { this.a3 = a; } @Inject void setA4(JSR330_A a) { this.a4 = a; } @Inject void setP3(Provider<JSR330_P3> p3) { this.p3 = p3; } @Inject void setValue(int value) { this.value = value; } @Inject void setN(@Named("n2") JSR330_N n) { this.n = n; } @Inject void setN2(@N1 JSR330_N n2) { this.n2 = n2; } @Inject public void init() { calledInit++; } @Inject public void init2() { super.init2(); } @Inject public void init2(JSR330_A a) { super.init2(); } } public abstract static class JSR330_D1 { protected JSR330_A a5; protected int calledInit2; @Inject private void setA5(JSR330_A a) { this.a5 = a; } @Inject public abstract void init(); @Inject public void init2() { calledInit2++; } @Inject public void init2(JSR330_A a) { init2(); } } @Singleton public static class JSR330_P1 { @Inject JSR330_A a; } public static class JSR330_P2 { @SuppressWarnings("unused") private final JSR330_A a; @Inject public JSR330_P2(JSR330_A a) { this.a = a; } /** * Bad constructor */ public JSR330_P2(JSR330_A a, JSR330_B b) { this.a = null; } } @Singleton public static class JSR330_P3 { @SuppressWarnings("unused") private JSR330_A a; @Inject public void setA(JSR330_A a) { this.a = a; } } public static class JSR330_P4 { @Inject public JSR330_P4(int value) { } } public static class JSR330_N { } public static class JSR330_N1 extends JSR330_N { } public static class JSR330_N2 extends JSR330_N { // Create a constructor with the inject annotation to indicate clearly that it is a component // JSR 330 aware @Inject public JSR330_N2() { } } public static class JSR330_N2_2 extends JSR330_N2 { public JSR330_N2_2() { } public JSR330_N2_2(JSR330_N n) { } } public static class JSR330_N2_3 extends JSR330_N2 { JSR330_N2_3() { } } public static class JSR330_N2_4 extends JSR330_N2 { private JSR330_N2_4() { } } public static class JSR330_N2_5 extends JSR330_N2 { protected JSR330_N2_5() { } } public static class JSR330_N2_6 extends JSR330_N2 { } public static class JSR330_N7 { @Inject public JSR330_N2 n; } public static class JSR330_N7_2 extends JSR330_N7 { } public static class JSR330_N8 { @Inject public void setJSR330_N2(JSR330_N2 n) { } } public static class JSR330_N8_2 extends JSR330_N8 { } @Singleton public static class JSR330_N8_3 extends JSR330_N8 { } @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface N1 { } @SuppressWarnings("unchecked") private static Class<? extends AS0> getClass(int index, boolean oldComponents) throws Exception { String classPrefix = S0.class.getName(); String classsuffix; if (index == 1) { classsuffix = oldComponents ? "" : "27"; } else { classsuffix = Integer.toString(oldComponents ? index : index + 26); } String classname = classPrefix + classsuffix; return (Class<? extends AS0>)Class.forName(classname); } private void testScope(RootContainer container, ContextManager manager, boolean oldComponents) throws Exception { assertFalse(ContainerUtil.isSingleton(getClass(1, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(2, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(3, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(4, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(5, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(6, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(7, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(8, oldComponents))); assertTrue(ContainerUtil.isSingleton(getClass(9, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(10, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(11, oldComponents))); assertTrue(ContainerUtil.isSingleton(getClass(12, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(13, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(14, oldComponents))); try { ContainerUtil.isSingleton(getClass(15, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.isSingleton(getClass(16, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.isSingleton(getClass(17, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.isSingleton(getClass(18, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.isSingleton(getClass(19, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.isSingleton(getClass(20, oldComponents)); } catch (DefinitionException e) { // OK } assertTrue(ContainerUtil.isSingleton(getClass(21, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(22, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(23, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(24, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(25, oldComponents))); assertFalse(ContainerUtil.isSingleton(getClass(26, oldComponents))); assertNull(ContainerUtil.getScope(getClass(1, oldComponents), true)); assertNull(ContainerUtil.getScope(getClass(2, oldComponents), true)); assertSame(Singleton.class, ContainerUtil.getScope(getClass(3, oldComponents), true)); assertSame(Singleton.class, ContainerUtil.getScope(getClass(4, oldComponents), true)); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(23, oldComponents), true)); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(24, oldComponents), true)); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(25, oldComponents), true)); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(26, oldComponents), true)); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(1, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(2, oldComponents))); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(3, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(4, oldComponents))); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(5, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(6, oldComponents))); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(7, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(8, oldComponents))); assertSame(Singleton.class, ContainerUtil.getScope(getClass(9, oldComponents))); assertSame(Dependent.class, ContainerUtil.getScope(getClass(10, oldComponents))); assertSame(RequestScoped.class, ContainerUtil.getScope(getClass(11, oldComponents))); assertSame(Singleton.class, ContainerUtil.getScope(getClass(12, oldComponents))); assertSame(Dependent.class, ContainerUtil.getScope(getClass(13, oldComponents))); assertSame(RequestScoped.class, ContainerUtil.getScope(getClass(14, oldComponents))); try { ContainerUtil.getScope(getClass(15, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.getScope(getClass(16, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.getScope(getClass(17, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.getScope(getClass(18, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.getScope(getClass(19, oldComponents)); } catch (DefinitionException e) { // OK } try { ContainerUtil.getScope(getClass(20, oldComponents)); } catch (DefinitionException e) { // OK } assertSame(Singleton.class, ContainerUtil.getScope(getClass(21, oldComponents))); assertSame(Dependent.class, ContainerUtil.getScope(getClass(22, oldComponents))); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(23, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(24, oldComponents))); assertSame(MyNormalScope.class, ContainerUtil.getScope(getClass(25, oldComponents))); assertSame(MyPseudoScope.class, ContainerUtil.getScope(getClass(26, oldComponents))); container.registerComponentImplementation(getClass(1, oldComponents)); container.registerComponentImplementation(getClass(2, oldComponents)); container.registerComponentImplementation(getClass(3, oldComponents)); container.registerComponentImplementation(getClass(4, oldComponents)); container.registerComponentImplementation(getClass(5, oldComponents)); container.registerComponentImplementation(getClass(6, oldComponents)); container.registerComponentImplementation(getClass(7, oldComponents)); container.registerComponentImplementation(getClass(8, oldComponents)); container.registerComponentImplementation(getClass(9, oldComponents)); container.registerComponentImplementation(getClass(10, oldComponents)); container.registerComponentImplementation(getClass(11, oldComponents)); container.registerComponentImplementation(getClass(12, oldComponents)); container.registerComponentImplementation(getClass(13, oldComponents)); container.registerComponentImplementation(getClass(14, oldComponents)); container.registerComponentImplementation(getClass(15, oldComponents)); container.registerComponentImplementation(getClass(16, oldComponents)); container.registerComponentImplementation(getClass(17, oldComponents)); container.registerComponentImplementation(getClass(18, oldComponents)); container.registerComponentImplementation(getClass(19, oldComponents)); container.registerComponentImplementation(getClass(20, oldComponents)); container.registerComponentImplementation(getClass(21, oldComponents)); container.registerComponentImplementation(getClass(22, oldComponents)); container.registerComponentImplementation(getClass(23, oldComponents)); container.registerComponentImplementation(getClass(24, oldComponents)); container.registerComponentImplementation(getClass(25, oldComponents)); container.registerComponentImplementation(getClass(26, oldComponents)); assertNotNull(container.getComponentInstanceOfType(getClass(1, oldComponents))); assertNotNull(container.getComponentInstanceOfType(getClass(2, oldComponents))); if (oldComponents) { assertSame(container.getComponentInstanceOfType(getClass(1, oldComponents)), container.getComponentInstanceOfType(getClass(1, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(1, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(1, oldComponents)).getId()); assertSame(container.getComponentInstanceOfType(getClass(2, oldComponents)), container.getComponentInstanceOfType(getClass(2, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(2, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(2, oldComponents)).getId()); } else { assertNotSame(container.getComponentInstanceOfType(getClass(1, oldComponents)), container.getComponentInstanceOfType(getClass(1, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(1, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(1, oldComponents)).getId()); assertNotSame(container.getComponentInstanceOfType(getClass(2, oldComponents)), container.getComponentInstanceOfType(getClass(2, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(2, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(2, oldComponents)).getId()); } assertNotNull(container.getComponentInstanceOfType(getClass(3, oldComponents))); assertSame(container.getComponentInstanceOfType(getClass(3, oldComponents)), container.getComponentInstanceOfType(getClass(3, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(3, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(3, oldComponents)).getId()); assertNotNull(container.getComponentInstanceOfType(getClass(4, oldComponents))); assertSame(container.getComponentInstanceOfType(getClass(4, oldComponents)), container.getComponentInstanceOfType(getClass(4, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(4, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(4, oldComponents)).getId()); assertNotNull(container.getComponentInstanceOfType(getClass(5, oldComponents))); assertNotNull(container.getComponentInstanceOfType(getClass(6, oldComponents))); if (manager == null && oldComponents) { assertSame(container.getComponentInstanceOfType(getClass(5, oldComponents)), container.getComponentInstanceOfType(getClass(5, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(5, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(5, oldComponents)).getId()); assertSame(container.getComponentInstanceOfType(getClass(6, oldComponents)), container.getComponentInstanceOfType(getClass(6, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(6, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(6, oldComponents)).getId()); } else { assertNotSame(container.getComponentInstanceOfType(getClass(5, oldComponents)), container.getComponentInstanceOfType(getClass(5, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(5, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(5, oldComponents)).getId()); assertNotSame(container.getComponentInstanceOfType(getClass(6, oldComponents)), container.getComponentInstanceOfType(getClass(6, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(6, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(6, oldComponents)).getId()); } ServletRequest req = createProxy(ServletRequest.class, new HashMap<Object, Object>()); if (manager != null) manager.<ServletRequest> getContext(RequestScoped.class).activate(req); assertNotNull(container.getComponentInstanceOfType(getClass(7, oldComponents))); assertNotNull(container.getComponentInstanceOfType(getClass(8, oldComponents))); if (manager == null && !oldComponents) { assertNotSame(container.getComponentInstanceOfType(getClass(7, oldComponents)), container.getComponentInstanceOfType(getClass(7, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(7, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(7, oldComponents)).getId()); assertNotSame(container.getComponentInstanceOfType(getClass(8, oldComponents)), container.getComponentInstanceOfType(getClass(8, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(8, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(8, oldComponents)).getId()); } else { assertSame(container.getComponentInstanceOfType(getClass(7, oldComponents)), container.getComponentInstanceOfType(getClass(7, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(7, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(7, oldComponents)).getId()); assertSame(container.getComponentInstanceOfType(getClass(8, oldComponents)), container.getComponentInstanceOfType(getClass(8, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(8, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(8, oldComponents)).getId()); } assertNotNull(container.getComponentInstanceOfType(getClass(11, oldComponents))); assertNotNull(container.getComponentInstanceOfType(getClass(14, oldComponents))); if (manager == null && !oldComponents) { assertNotSame(container.getComponentInstanceOfType(getClass(11, oldComponents)), container.getComponentInstanceOfType(getClass(11, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(11, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(11, oldComponents)).getId()); assertNotSame(container.getComponentInstanceOfType(getClass(14, oldComponents)), container.getComponentInstanceOfType(getClass(14, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(14, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(14, oldComponents)).getId()); } else { assertSame(container.getComponentInstanceOfType(getClass(11, oldComponents)), container.getComponentInstanceOfType(getClass(11, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(11, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(11, oldComponents)).getId()); assertSame(container.getComponentInstanceOfType(getClass(14, oldComponents)), container.getComponentInstanceOfType(getClass(14, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(14, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(14, oldComponents)).getId()); } if (manager != null) manager.<ServletRequest> getContext(RequestScoped.class).deactivate(req); try { container.getComponentInstanceOfType(getClass(7, oldComponents)).getId(); if (manager != null) fail("An exception is expected as we are out of a request context"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(8, oldComponents)).getId(); if (manager != null) fail("An exception is expected as we are out of a request context"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(11, oldComponents)).getId(); if (manager != null) fail("An exception is expected as we are out of a request context"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(14, oldComponents)).getId(); if (manager != null) fail("An exception is expected as we are out of a request context"); } catch (Exception e1) { // ok if (manager == null) throw e1; } assertNotNull(container.getComponentInstanceOfType(getClass(9, oldComponents))); assertSame(container.getComponentInstanceOfType(getClass(9, oldComponents)), container.getComponentInstanceOfType(getClass(9, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(9, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(9, oldComponents)).getId()); assertNotNull(container.getComponentInstanceOfType(getClass(10, oldComponents))); assertNotNull(container.getComponentInstanceOfType(getClass(13, oldComponents))); if (manager == null && oldComponents) { assertSame(container.getComponentInstanceOfType(getClass(10, oldComponents)), container.getComponentInstanceOfType(getClass(10, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(10, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(10, oldComponents)).getId()); assertSame(container.getComponentInstanceOfType(getClass(13, oldComponents)), container.getComponentInstanceOfType(getClass(13, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(13, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(13, oldComponents)).getId()); } else { assertNotSame(container.getComponentInstanceOfType(getClass(10, oldComponents)), container.getComponentInstanceOfType(getClass(10, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(10, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(10, oldComponents)).getId()); assertNotSame(container.getComponentInstanceOfType(getClass(13, oldComponents)), container.getComponentInstanceOfType(getClass(13, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(13, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(13, oldComponents)).getId()); } assertNotNull(container.getComponentInstanceOfType(getClass(12, oldComponents))); assertSame(container.getComponentInstanceOfType(getClass(12, oldComponents)), container.getComponentInstanceOfType(getClass(12, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(12, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(12, oldComponents)).getId()); try { container.getComponentInstanceOfType(getClass(15, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } try { container.getComponentInstanceOfType(getClass(16, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } try { container.getComponentInstanceOfType(getClass(17, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } try { container.getComponentInstanceOfType(getClass(18, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } try { container.getComponentInstanceOfType(getClass(19, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } try { container.getComponentInstanceOfType(getClass(20, oldComponents)); if (manager != null || !oldComponents) fail("An exception is expected as the scope is invalid"); } catch (Exception e1) { // ok if (manager == null && oldComponents) throw e1; } assertNotNull(container.getComponentInstanceOfType(getClass(21, oldComponents))); assertSame(container.getComponentInstanceOfType(getClass(21, oldComponents)), container.getComponentInstanceOfType(getClass(21, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(21, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(21, oldComponents)).getId()); assertNotNull(container.getComponentInstanceOfType(getClass(22, oldComponents))); if (manager == null && oldComponents) { assertSame(container.getComponentInstanceOfType(getClass(22, oldComponents)), container.getComponentInstanceOfType(getClass(22, oldComponents))); assertEquals(container.getComponentInstanceOfType(getClass(22, oldComponents)).getId(), container.getComponentInstanceOfType(getClass(22, oldComponents)).getId()); } else { assertNotSame(container.getComponentInstanceOfType(getClass(22, oldComponents)), container.getComponentInstanceOfType(getClass(22, oldComponents))); assertFalse(container.getComponentInstanceOfType(getClass(22, oldComponents)).getId() == container.getComponentInstanceOfType(getClass(22, oldComponents)).getId()); } try { container.getComponentInstanceOfType(getClass(23, oldComponents)); if (manager != null) fail("An exception is expected as the scope and the default scopes are unknown"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(24, oldComponents)); if (manager != null) fail("An exception is expected as the scope and the default scopes are unknown"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(25, oldComponents)); if (manager != null) fail("An exception is expected as the scope and the default scopes are unknown"); } catch (Exception e1) { // ok if (manager == null) throw e1; } try { container.getComponentInstanceOfType(getClass(26, oldComponents)); if (manager != null) fail("An exception is expected as the scope and the default scopes are unknown"); } catch (Exception e1) { // ok if (manager == null) throw e1; } } @Test public void testScopeWithNoContextManager() throws Exception { final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml"); ContextManager manager = container.getComponentInstanceOfType(ContextManager.class); assertNull(manager); testScope(container, manager, true); testScope(container, manager, false); } @Test public void testScope() throws Exception { assertFalse(ContainerUtil.isSingleton(S1.class)); assertFalse(ContainerUtil.isSingleton(S2.class)); assertTrue(ContainerUtil.isSingleton(S3.class)); assertTrue(ContainerUtil.isSingleton(S4.class)); assertTrue(ContainerUtil.isSingleton(S5.class)); assertFalse(ContainerUtil.isSingleton(S6.class)); assertFalse(ContainerUtil.isSingleton(S7.class)); assertTrue(ContainerUtil.isSingleton(S8.class)); assertSame(RequestScoped.class, ContainerUtil.getScope(S1.class)); assertSame(SessionScoped.class, ContainerUtil.getScope(S2.class)); assertSame(ApplicationScoped.class, ContainerUtil.getScope(S3.class)); assertSame(Singleton.class, ContainerUtil.getScope(S4.class)); assertNull(ContainerUtil.getScope(S5.class)); assertNull(ContainerUtil.getScope(S6.class)); assertSame(Dependent.class, ContainerUtil.getScope(S7.class)); assertSame(ApplicationScoped.class, ContainerUtil.getScope(S8.class)); final RootContainer container = AbstractTestContainer.createRootContainer(getClass(), "test-exo-container.xml", "testScope"); container.registerComponentImplementation(S1.class); container.registerComponentImplementation(S1_DEP1.class); container.registerComponentImplementation(S1_DEP2.class); container.registerComponentImplementation(S1_DEP3.class); container.registerComponentImplementation(S1_DEP4.class); container.registerComponentImplementation(S1_DEP5.class); container.registerComponentImplementation(S1_DEP6.class); container.registerComponentImplementation(S2.class); container.registerComponentImplementation(S20.class); container.registerComponentImplementation(S3.class); container.registerComponentImplementation(S4.class); container.registerComponentImplementation(S5.class); container.registerComponentImplementation(S6.class); container.registerComponentImplementation(S7.class); container.registerComponentImplementation(S8.class); container.registerComponentImplementation(Unproxyable1.class); container.registerComponentImplementation(Unproxyable2.class); container.registerComponentImplementation(Unproxyable3.class); container.registerComponentImplementation(Unproxyable4.class); container.registerComponentImplementation(Unproxyable5.class); container.registerComponentImplementation(Proxyable.class); container.registerComponentImplementation(Proxyable2.class); ContextManager manager = container.getComponentInstanceOfType(ContextManager.class); assertNotNull(manager); testScope(container, manager, true); testScope(container, manager, false); try { container.getComponentInstanceOfType(Unproxyable1.class); fail("An exception is expected as the class is unproxyable"); } catch (Exception e) { // ok } try { container.getComponentInstanceOfType(Unproxyable2.class); fail("An exception is expected as the class is unproxyable"); } catch (Exception e) { // ok } try { container.getComponentInstanceOfType(Unproxyable3.class); fail("An exception is expected as the class is unproxyable"); } catch (Exception e) { // ok } try { container.getComponentInstanceOfType(Unproxyable4.class); fail("An exception is expected as the class is unproxyable"); } catch (Exception e) { // ok } try { container.getComponentInstanceOfType(Unproxyable5.class); fail("An exception is expected as the class is unproxyable"); } catch (Exception e) { // ok } assertNotNull(container.getComponentInstanceOfType(Proxyable.class)); assertNotNull(container.getComponentInstanceOfType(Proxyable2.class)); try { container.getComponentInstanceOfType(S1.class).getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } S4 s4 = container.getComponentInstanceOfType(S4.class); assertSame(s4, container.getComponentInstanceOfType(S4.class)); assertSame(Singleton.class, ((MX4JComponentAdapter<S4>)container.getComponentAdapterOfType(S4.class)).getScope()); S5 s5 = container.getComponentInstanceOfType(S5.class); assertSame(s5, container.getComponentInstanceOfType(S5.class)); assertSame(Singleton.class, ((MX4JComponentAdapter<S5>)container.getComponentAdapterOfType(S5.class)).getScope()); S6 s6 = container.getComponentInstanceOfType(S6.class); assertNotSame(s6, container.getComponentInstanceOfType(S6.class)); assertSame(Dependent.class, ((MX4JComponentAdapter<S6>)container.getComponentAdapterOfType(S6.class)).getScope()); S7 s7 = container.getComponentInstanceOfType(S7.class); assertNotSame(s7, container.getComponentInstanceOfType(S7.class)); assertSame(Dependent.class, ((MX4JComponentAdapter<S7>)container.getComponentAdapterOfType(S7.class)).getScope()); S8 s8 = container.getComponentInstanceOfType(S8.class); assertSame(s8, container.getComponentInstanceOfType(S8.class)); assertSame(ApplicationScoped.class, ((MX4JComponentAdapter<S8>)container.getComponentAdapterOfType(S8.class)).getScope()); try { s4.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s5.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s6.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s7.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s8.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } // Request 1 Map<Object, Object> mapReq1 = new HashMap<Object, Object>(); ServletRequest req1 = createProxy(ServletRequest.class, mapReq1); manager.<ServletRequest> getContext(RequestScoped.class).activate(req1); S1 s1 = container.getComponentInstanceOfType(S1.class); int s1Id = s1.getId(); assertEquals(1, mapReq1.size()); assertNotNull(s1); assertSame(s1, container.getComponentInstanceOfType(S1.class)); assertEquals(s1Id, container.getComponentInstanceOfType(S1.class).getId()); assertEquals(s1Id, s1.getId()); assertEquals(s1Id, s1.getId2()); assertEquals(s1Id, s1.getId3()); assertSame(s1, s4.s1); assertEquals(s1Id, s4.s1.getId()); assertEquals(s1Id, s4.s1.getId2()); assertEquals(s1Id, s4.s1.getId3()); assertSame(s1, s5.s1); assertEquals(s1Id, s5.s1.getId()); assertEquals(s1Id, s5.s1.getId2()); assertEquals(s1Id, s5.s1.getId3()); assertSame(s1, s6.s1); assertEquals(s1Id, s6.s1.getId()); assertEquals(s1Id, s6.s1.getId2()); assertEquals(s1Id, s6.s1.getId3()); assertSame(s1, s7.s1); assertEquals(s1Id, s7.s1.getId()); assertEquals(s1Id, s7.s1.getId2()); assertEquals(s1Id, s7.s1.getId3()); assertSame(s1, s8.s1); assertEquals(s1Id, s8.s1.getId()); assertEquals(s1Id, s8.s1.getId2()); assertEquals(s1Id, s8.s1.getId3()); assertNotNull(s1.getDep1()); assertNotNull(s1.getDep2()); assertNotNull(s1.getDep3()); assertNotNull(s1.getDep4()); assertNotNull(s1.getDep5()); assertSame(s1.getDep1(), container.getComponentInstanceOfType(S1_DEP1.class)); int dep1Id; assertEquals(dep1Id = s1.getDep1().getId(), container.getComponentInstanceOfType(S1_DEP1.class).getId()); assertEquals(s1.getDep1().getId(), s1.getDep1Id()); assertSame(s1.getDep2(), container.getComponentInstanceOfType(S1_DEP2.class)); try { s1.getDep2().getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } assertSame(s1.getDep3(), container.getComponentInstanceOfType(S1_DEP3.class)); assertEquals(s1.getDep3().getId(), container.getComponentInstanceOfType(S1_DEP3.class).getId()); assertSame(s1.getDep4(), container.getComponentInstanceOfType(S1_DEP4.class)); assertEquals(s1.getDep4().getId(), container.getComponentInstanceOfType(S1_DEP4.class).getId()); assertNotSame(s1.getDep5(), container.getComponentInstanceOfType(S1_DEP5.class)); assertSame(s1.getDep6(), container.getComponentInstanceOfType(S1_DEP6.class)); assertEquals(s1.getDep6().getId(), container.getComponentInstanceOfType(S1_DEP6.class).getId()); assertSame(s1, s1.getDep6().getS1()); assertEquals(s1.getId(), s1.getDep6().getS1().getId()); assertSame(s1, container.getComponentInstanceOfType(S1_DEP6.class).getS1()); assertEquals(s1.getId(), container.getComponentInstanceOfType(S1_DEP6.class).getS1().getId()); manager.<ServletRequest> getContext(RequestScoped.class).deactivate(req1); assertTrue(mapReq1.isEmpty()); s4 = container.getComponentInstanceOfType(S4.class); assertSame(s1, s4.s1); s5 = container.getComponentInstanceOfType(S5.class); assertSame(s1, s5.s1); s6 = container.getComponentInstanceOfType(S6.class); assertSame(s1, s6.s1); s7 = container.getComponentInstanceOfType(S7.class); assertSame(s1, s7.s1); s8 = container.getComponentInstanceOfType(S8.class); assertSame(s1, s8.s1); try { container.getComponentInstanceOfType(S1.class).getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s4.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s5.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s6.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s7.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } try { s8.s1.getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } // Request 2 ServletRequest req2 = createProxy(ServletRequest.class, new HashMap<Object, Object>()); manager.<ServletRequest> getContext(RequestScoped.class).activate(req2); S1 s1_2 = container.getComponentInstanceOfType(S1.class); assertNotNull(s1_2); assertSame(s1_2, container.getComponentInstanceOfType(S1.class)); assertEquals(s1_2.getId(), container.getComponentInstanceOfType(S1.class).getId()); assertFalse(s1_2.getId() == s1Id); assertSame(s1_2, s4.s1); assertEquals(s1_2.getId(), s4.s1.getId()); assertEquals(s1_2.getId(), s4.s1.getId2()); assertEquals(s1_2.getId(), s4.s1.getId3()); assertSame(s1_2, s5.s1); assertEquals(s1_2.getId(), s5.s1.getId()); assertEquals(s1_2.getId(), s5.s1.getId2()); assertEquals(s1_2.getId(), s5.s1.getId3()); assertSame(s1_2, s6.s1); assertEquals(s1_2.getId(), s6.s1.getId()); assertEquals(s1_2.getId(), s6.s1.getId2()); assertEquals(s1_2.getId(), s6.s1.getId3()); assertSame(s1_2, s7.s1); assertEquals(s1_2.getId(), s7.s1.getId()); assertEquals(s1_2.getId(), s7.s1.getId2()); assertEquals(s1_2.getId(), s7.s1.getId3()); assertSame(s1_2, s8.s1); assertEquals(s1_2.getId(), s8.s1.getId()); assertEquals(s1_2.getId(), s8.s1.getId2()); assertEquals(s1_2.getId(), s8.s1.getId3()); assertNotNull(s1_2.getDep1()); assertNotNull(s1_2.getDep2()); assertNotNull(s1_2.getDep3()); assertNotNull(s1_2.getDep4()); assertNotNull(s1_2.getDep5()); assertSame(s1_2.getDep1(), container.getComponentInstanceOfType(S1_DEP1.class)); assertEquals(s1_2.getDep1().getId(), container.getComponentInstanceOfType(S1_DEP1.class).getId()); assertEquals(s1_2.getDep1().getId(), s1_2.getDep1Id()); assertTrue(s1_2.getDep1().getId() != dep1Id); assertSame(s1_2.getDep2(), container.getComponentInstanceOfType(S1_DEP2.class)); try { s1_2.getDep2().getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } assertSame(s1_2.getDep3(), container.getComponentInstanceOfType(S1_DEP3.class)); assertEquals(s1_2.getDep3().getId(), container.getComponentInstanceOfType(S1_DEP3.class).getId()); assertSame(s1_2.getDep4(), container.getComponentInstanceOfType(S1_DEP4.class)); assertEquals(s1_2.getDep4().getId(), container.getComponentInstanceOfType(S1_DEP4.class).getId()); assertNotSame(s1_2.getDep5(), container.getComponentInstanceOfType(S1_DEP5.class)); assertSame(s1_2.getDep6(), container.getComponentInstanceOfType(S1_DEP6.class)); assertEquals(s1_2.getDep6().getId(), container.getComponentInstanceOfType(S1_DEP6.class).getId()); assertSame(s1_2, s1_2.getDep6().getS1()); assertEquals(s1_2.getId(), s1_2.getDep6().getS1().getId()); assertSame(s1_2, container.getComponentInstanceOfType(S1_DEP6.class).getS1()); assertEquals(s1_2.getId(), container.getComponentInstanceOfType(S1_DEP6.class).getS1().getId()); manager.<ServletRequest> getContext(RequestScoped.class).deactivate(req2); try { container.getComponentInstanceOfType(S2.class).getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } // Request1 out of any session context manager.<HttpSession> getContext(SessionScoped.class).activate(null); try { container.getComponentInstanceOfType(S2.class).getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } manager.<HttpSession> getContext(SessionScoped.class).deactivate(null); // Register a session Map<Object, Object> mapSession1 = new HashMap<Object, Object>(); HttpSession session1 = createProxy(HttpSession.class, mapSession1); manager.<HttpSession> getContext(SessionScoped.class).register(session1); // Request2 out of any session context manager.<HttpSession> getContext(SessionScoped.class).activate(null); try { container.getComponentInstanceOfType(S2.class).getId(); fail("An exception is expected as the scope is not active"); } catch (Exception e) { // ok } assertTrue(mapSession1.isEmpty()); manager.<HttpSession> getContext(SessionScoped.class).deactivate(null); // Request3 within the session context manager.<HttpSession> getContext(SessionScoped.class).activate(session1); try { container.getComponentInstanceOfType(S20.class); fail("An exception is expected as it is a passivating scope and S20 is not serializable"); } catch (Exception e) { // ok } S2 s2 = container.getComponentInstanceOfType(S2.class); assertNotNull(s2); int s2Id = s2.getId(); assertSame(s2, container.getComponentInstanceOfType(S2.class)); assertEquals(s2Id, container.getComponentInstanceOfType(S2.class).getId()); manager.<HttpSession> getContext(SessionScoped.class).deactivate(session1); // Request4 within the session context manager.<HttpSession> getContext(SessionScoped.class).activate(session1); S2 s2_2 = container.getComponentInstanceOfType(S2.class); assertNotNull(s2_2); assertSame(s2_2, container.getComponentInstanceOfType(S2.class)); assertSame(s2_2, s2); assertEquals(s2_2.getId(), s2Id); manager.<HttpSession> getContext(SessionScoped.class).deactivate(session1); // Register session 2 Map<Object, Object> mapSession2 = new HashMap<Object, Object>(); HttpSession session2 = createProxy(HttpSession.class, mapSession2); manager.<HttpSession> getContext(SessionScoped.class).register(session2); // Request5 within the session context of session#2 manager.<HttpSession> getContext(SessionScoped.class).activate(session2); S2 s2_3 = container.getComponentInstanceOfType(S2.class); assertNotNull(s2_3); assertSame(s2_3, container.getComponentInstanceOfType(S2.class)); assertFalse(s2_3.getId() == s2Id); assertEquals(1, mapSession2.size()); manager.<HttpSession> getContext(SessionScoped.class).deactivate(session2); assertEquals(1, mapSession2.size()); // Unregister session 2 manager.<HttpSession> getContext(SessionScoped.class).unregister(session2); assertTrue(mapSession2.isEmpty()); // Unregister session 1 manager.<HttpSession> getContext(SessionScoped.class).unregister(session1); assertTrue(mapSession1.isEmpty()); // Request6 out of any session context manager.<HttpSession> getContext(SessionScoped.class).activate(session1); container.getComponentInstanceOfType(S2.class).getId(); assertEquals(1, mapSession1.size()); manager.<HttpSession> getContext(SessionScoped.class).deactivate(session1); // Register session 3 Map<Object, Object> mapSession3 = new HashMap<Object, Object>(); HttpSession session3 = createProxy(HttpSession.class, mapSession2); manager.<HttpSession> getContext(SessionScoped.class).register(session3); checkConcurrentAccesses(container, S2.class, mapSession3, HttpSession.class, manager.<HttpSession> getContext(SessionScoped.class)); // Unregister session 3 manager.<HttpSession> getContext(SessionScoped.class).unregister(session3); // Request1 within the application context as it is always active S3 s3 = container.getComponentInstanceOfType(S3.class); assertNotNull(s3); assertSame(s3, container.getComponentInstanceOfType(S3.class)); assertEquals(s3.getId(), container.getComponentInstanceOfType(S3.class).getId()); } private <T> T createProxy(Class<T> type, final Map<Object, Object> map) { Object o = Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{type}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) { if ("setAttribute".equals(method.getName())) { Object o = map.put(args[0], args[1]); if (o != null) { throw new IllegalStateException("A value has already been set"); } } else if ("getAttribute".equals(method.getName())) { return map.get(args[0]); } else if ("removeAttribute".equals(method.getName())) { map.remove(args[0]); } else if ("getId".equals(method.getName())) { return Integer.toString(System.identityHashCode(map)); } else if ("getAttributeNames".equals(method.getName())) { final Iterator<Object> keys = map.keySet().iterator(); return new Enumeration<Object>() { public boolean hasMoreElements() { return keys.hasNext(); } public Object nextElement() { return keys.next(); } }; } return null; } }); return type.cast(o); } private <K> void checkConcurrentAccesses(final RootContainer container, final Class<? extends S> type, final Map<Object, Object> map, final Class<K> keyType, final AdvancedContext<K> context) throws Exception { int reader = 20; final List<S> results = new CopyOnWriteArrayList<S>(); final List<Integer> ids = new CopyOnWriteArrayList<Integer>(); final CountDownLatch startSignal = new CountDownLatch(1); final CountDownLatch doneSignal = new CountDownLatch(reader); final List<Exception> errors = Collections.synchronizedList(new ArrayList<Exception>()); for (int i = 0; i < reader; i++) { Thread thread = new Thread() { public void run() { K key = createProxy(keyType, map); try { context.activate(key); startSignal.await(); S s = container.getComponentInstanceOfType(type); ids.add(s.getId()); results.add(s); } catch (Exception e) { errors.add(e); } finally { doneSignal.countDown(); context.deactivate(key); } } }; thread.start(); } startSignal.countDown(); doneSignal.await(); if (!errors.isEmpty()) { for (Exception e : errors) { e.printStackTrace(); } throw errors.get(0); } assertEquals(reader, results.size()); assertEquals(reader, ids.size()); S value = results.get(0); int id = ids.get(0); for (int i = 1; i < reader; i++) { assertSame(value, results.get(i)); assertEquals(id, ids.get(i).intValue()); } assertEquals(1, map.size()); } @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) @Documented @NormalScope @Inherited public static @interface MyNormalScope { } @Retention(RUNTIME) @Documented @Scope public static @interface MyPseudoScope { } @Singleton @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype { } @Dependent @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype2 { } @RequestScoped @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype3 { } @Singleton @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype4 { } @Dependent @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype5 { } @RequestScoped @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype6 { } @ApplicationScoped @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype7 { } @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype8 { } @MyNormalScope @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype9 { } @MyPseudoScope @Stereotype @Target(TYPE) @Retention(RUNTIME) public static @interface MyStereotype10 { } // Old components @MyNormalScope public static class S0 extends AS0 { } @MyPseudoScope public static class S02 extends AS0 { } @MyStereotype @MyNormalScope public static class S03 extends AS0 { } @MyStereotype @MyPseudoScope public static class S04 extends AS0 { } @MyStereotype2 @MyNormalScope public static class S05 extends AS0 { } @MyStereotype2 @MyPseudoScope public static class S06 extends AS0 { } @MyStereotype3 @MyNormalScope public static class S07 extends AS0 { } @MyStereotype3 @MyPseudoScope public static class S08 extends AS0 { } @MyStereotype public static class S09 extends AS0 { } @MyStereotype2 public static class S010 extends AS0 { } @MyStereotype3 public static class S011 extends AS0 { } @MyStereotype @MyStereotype4 public static class S012 extends AS0 { } @MyStereotype2 @MyStereotype5 public static class S013 extends AS0 { } @MyStereotype3 @MyStereotype6 public static class S014 extends AS0 { } @MyStereotype @MyStereotype2 public static class S015 extends AS0 { } @MyStereotype @MyStereotype3 public static class S016 extends AS0 { } @MyStereotype3 @MyStereotype7 public static class S017 extends AS0 { } @Singleton @Dependent public static class S018 extends AS0 { } @Singleton @ApplicationScoped public static class S019 extends AS0 { } @MyStereotype8 public static class S020 extends AS0 { } @MyStereotype @MyStereotype8 public static class S021 extends AS0 { } @MyStereotype2 @MyStereotype8 public static class S022 extends AS0 { } @MyNormalScope @MyStereotype9 public static class S023 extends AS0 { } @MyPseudoScope @MyStereotype9 public static class S024 extends AS0 { } @MyNormalScope @MyStereotype10 public static class S025 extends AS0 { } @MyPseudoScope @MyStereotype10 public static class S026 extends AS0 { } // New components @MyNormalScope public static class S027 extends AS0 { @Inject public void init(){} } @MyPseudoScope public static class S028 extends AS0 { @Inject public void init(){} } @MyStereotype @MyNormalScope public static class S029 extends AS0 { @Inject public void init(){} } @MyStereotype @MyPseudoScope public static class S030 extends AS0 { @Inject public void init(){} } @MyStereotype2 @MyNormalScope public static class S031 extends AS0 { @Inject public void init(){} } @MyStereotype2 @MyPseudoScope public static class S032 extends AS0 { @Inject public void init(){} } @MyStereotype3 @MyNormalScope public static class S033 extends AS0 { @Inject public void init(){} } @MyStereotype3 @MyPseudoScope public static class S034 extends AS0 { @Inject public void init(){} } @MyStereotype public static class S035 extends AS0 { @Inject public void init(){} } @MyStereotype2 public static class S036 extends AS0 { @Inject public void init(){} } @MyStereotype3 public static class S037 extends AS0 { @Inject public void init(){} } @MyStereotype @MyStereotype4 public static class S038 extends AS0 { @Inject public void init(){} } @MyStereotype2 @MyStereotype5 public static class S039 extends AS0 { @Inject public void init(){} } @MyStereotype3 @MyStereotype6 public static class S040 extends AS0 { @Inject public void init(){} } @MyStereotype @MyStereotype2 public static class S041 extends AS0 { @Inject public void init(){} } @MyStereotype @MyStereotype3 public static class S042 extends AS0 { @Inject public void init(){} } @MyStereotype3 @MyStereotype7 public static class S043 extends AS0 { @Inject public void init(){} } @Singleton @Dependent public static class S044 extends AS0 { @Inject public void init(){} } @Singleton @ApplicationScoped public static class S045 extends AS0 { @Inject public void init(){} } @MyStereotype8 public static class S046 extends AS0 { @Inject public void init(){} } @MyStereotype @MyStereotype8 public static class S047 extends AS0 { @Inject public void init(){} } @MyStereotype2 @MyStereotype8 public static class S048 extends AS0 { @Inject public void init(){} } @MyNormalScope @MyStereotype9 public static class S049 extends AS0 { @Inject public void init(){} } @MyPseudoScope @MyStereotype9 public static class S050 extends AS0 { @Inject public void init(){} } @MyNormalScope @MyStereotype10 public static class S051 extends AS0 { @Inject public void init(){} } @MyPseudoScope @MyStereotype10 public static class S052 extends AS0 { @Inject public void init(){} } public abstract static class AS0 { private final int id = System.identityHashCode(this); public int getId() { return id; } } @RequestScoped public static class S1 { private final int id = System.identityHashCode(this); private S1_DEP1 dep1; private int dep1Id; @Inject protected S1_DEP2 dep2; @Inject public S1_DEP3 dep3; @Inject private S1_DEP4 dep4; private S1_DEP5 dep5; private S1_DEP6 dep6; public int getId() { return id; } protected int getId2() { return id; } int getId3() { return id; } @Inject public void setDep1(S1_DEP1 dep1) { this.dep1 = dep1; this.dep1Id = dep1.getId(); } @Inject protected void setDep5(S1_DEP5 dep5) { this.dep5 = dep5; } @Inject void setDep6(S1_DEP6 dep6) { this.dep6 = dep6; } /** * @return the dep1 */ public S1_DEP1 getDep1() { return dep1; } /** * @return the dep1Id */ public int getDep1Id() { return dep1Id; } /** * @return the dep2 */ public S1_DEP2 getDep2() { return dep2; } /** * @return the dep3 */ public S1_DEP3 getDep3() { return dep3; } /** * @return the dep4 */ public S1_DEP4 getDep4() { return dep4; } /** * @return the dep5 */ public S1_DEP5 getDep5() { return dep5; } /** * @return the dep6 */ public S1_DEP6 getDep6() { return dep6; } } @RequestScoped public static class S1_DEP1 { private final int id = System.identityHashCode(this); public int getId() { return id; } } @SuppressWarnings("serial") @SessionScoped public static class S1_DEP2 implements Serializable { private final int id = System.identityHashCode(this); public int getId() { return id; } } @ApplicationScoped public static class S1_DEP3 { private final int id = System.identityHashCode(this); public int getId() { return id; } } @Singleton public static class S1_DEP4 { private final int id = System.identityHashCode(this); public int getId() { return id; } } @Dependent public static class S1_DEP5 { private final int id = System.identityHashCode(this); public int getId() { return id; } } @RequestScoped public static class S1_DEP6 { @Inject public S1 s1; private final int id = System.identityHashCode(this); public int getId() { return id; } public S1 getS1() { return s1; } } @SessionScoped public static class S20 { } @SuppressWarnings("serial") @SessionScoped public static class S2 implements S, Serializable { private final int id = System.identityHashCode(this); public int getId() { return id; } } @ApplicationScoped public static class S3 implements S { private final int id = System.identityHashCode(this); public int getId() { return id; } } public static interface S { int getId(); } /** * New singleton */ @Singleton public static class S4 { @Inject private S1 s1; } /** * Old singleton */ public static class S5 { private S1 s1; public S5(S1 s1) { this.s1 = s1; } } /** * New bean with the default scope */ public static class S6 { @Inject private S1 s1; } /** * New bean with the dependent scope */ @Dependent public static class S7 { @Inject private S1 s1; } /** * New bean with an inherited application scope */ public static class S8 extends S9 { @Inject private S1 s1; } @ApplicationScoped public static class S9 { } @RequestScoped public static class Unproxyable1 { @Inject public Unproxyable1(S1 s1) { } } @RequestScoped public static final class Unproxyable2 { } @RequestScoped public static class Unproxyable3 { public final void foo() { } } @RequestScoped public static class Unproxyable4 { protected final void foo() { } } @RequestScoped public static class Unproxyable5 { protected final void foo() { } } @RequestScoped public static class Proxyable { @SuppressWarnings("unused") private final void foo() { } } @RequestScoped public static class Proxyable2 { public static void foo() { } } @Test public void testGetExternalComponentPluginsUnused() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).build(); ExoContainer container = PortalContainer.getInstance(); assertNull(container.getExternalComponentPluginsUnused()); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL) .profiledBy("testGetExternalComponentPluginsUnused").build(); container = PortalContainer.getInstance(); assertNotNull(container.getExternalComponentPluginsUnused()); assertEquals(1, container.getExternalComponentPluginsUnused().size()); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testAutoRegistration").build(); container = PortalContainer.getInstance(); assertNull(container.getExternalComponentPluginsUnused()); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL) .profiledBy("testAutoRegistration", "testGetExternalComponentPluginsUnused").build(); container = PortalContainer.getInstance(); assertNotNull(container.getExternalComponentPluginsUnused()); assertEquals(1, container.getExternalComponentPluginsUnused().size()); } @Test public void testDefinitionByType() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); final RootContainer rootContainer = new ContainerBuilder().withRoot(rootURL).withPortal(portalURL). profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1.class)); assertTrue(container.getComponentInstanceOfType(AutoRegistration1.class).started); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1.class).plugin); assertEquals("AutoRegistration1", container.getComponentInstanceOfType(AutoRegistration1.class).plugin.getName()); assertNull(rootContainer.getComponentInstanceOfType(AutoRegistration1.class)); try { container.getComponentInstanceOfType(AutoRegistration2.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration3.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration4.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNull(container.getComponentInstanceOfType(AutoRegistration5.class, false)); assertNotNull(container.getComponentInstanceOfType(AutoRegistration5.class)); assertTrue(container.getComponentInstanceOfType(AutoRegistration6.class) instanceof AutoRegistration6Type); try { container.getComponentInstanceOfType(AutoRegistration7.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration8.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } assertNull(container.getComponentInstanceOfType(AutoRegistration9.class, false)); assertNotNull(container.getComponentInstanceOfType(AutoRegistration9.class)); } @Test public void testDefinitionByTypeWithProvider() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); container.registerComponentImplementation(AutoRegistration1P.class); container.registerComponentImplementation(AutoRegistration2P.class); container.registerComponentImplementation(AutoRegistration3P.class); container.registerComponentImplementation(AutoRegistration4P.class); container.registerComponentImplementation(AutoRegistration5P.class); container.registerComponentImplementation(AutoRegistration6P.class); container.registerComponentImplementation(AutoRegistration7P.class); container.registerComponentImplementation(AutoRegistration8P.class); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1P.class).p.get()); assertTrue(container.getComponentInstanceOfType(AutoRegistration1P.class).p.get().started); assertNotNull(container.getComponentInstanceOfType(AutoRegistration1P.class).p.get().plugin); assertEquals("AutoRegistration1", container.getComponentInstanceOfType(AutoRegistration1P.class).p.get().plugin.getName()); try { container.getComponentInstanceOfType(AutoRegistration2P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration3P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration4P.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistration5P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistration5P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistration5P.class).p.get()); assertNotNull(container.getComponentInstanceOfType(AutoRegistration6P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistration6P.class).p); assertTrue(container.getComponentInstanceOfType(AutoRegistration6P.class).p.get() instanceof AutoRegistration6Type); try { container.getComponentInstanceOfType(AutoRegistration7P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistration8P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } } @DefinitionByType public static class AutoRegistration1 implements Startable { boolean started; ComponentPlugin plugin; public void start() { started = true; } public void stop() { } public void add(ComponentPlugin plugin) { this.plugin = plugin; } } public static class AutoRegistration1P { @Inject public Provider<AutoRegistration1> p; } @DefinitionByType public static abstract class AutoRegistration2 {} public static class AutoRegistration2P { @Inject public Provider<AutoRegistration2> p; } @DefinitionByType public static interface AutoRegistration3 {} public static class AutoRegistration3P { @Inject public Provider<AutoRegistration3> p; } @DefinitionByType(type = AutoRegistration1.class) public static class AutoRegistration4 {} public static class AutoRegistration4P { @Inject public Provider<AutoRegistration4> p; } @DefinitionByType(type = AutoRegistration5.class) public static class AutoRegistration5 {} public static class AutoRegistration5P { @Inject public Provider<AutoRegistration5> p; } @DefinitionByType(type = AutoRegistration6Type.class) public static interface AutoRegistration6 {} public static class AutoRegistration6Type implements AutoRegistration6 {} public static class AutoRegistration6P { @Inject public Provider<AutoRegistration6> p; } @DefinitionByType(type = AutoRegistration7Type.class) public static interface AutoRegistration7 {} public static abstract class AutoRegistration7Type implements AutoRegistration7 {} public static class AutoRegistration7P { @Inject public Provider<AutoRegistration7> p; } @DefinitionByType(type = AutoRegistration8Type.class) public static interface AutoRegistration8 {} public static interface AutoRegistration8Type extends AutoRegistration8 {} public static class AutoRegistration8P { @Inject public Provider<AutoRegistration8> p; } @DefinitionByType(target={RootContainer.class}) public static class AutoRegistration9 {} @Test public void testDefinitionByName() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); final RootContainer rootContainer = new ContainerBuilder().withRoot(rootURL).withPortal(portalURL). profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); assertNull(container.getComponentInstanceOfType(AutoRegistrationN1.class)); assertNull(container.getComponentInstance("", AutoRegistrationN1.class, false)); assertNotNull(container.getComponentInstance("", AutoRegistrationN1.class)); assertTrue(container.getComponentInstance("", AutoRegistrationN1.class).started); assertNotNull(container.getComponentInstance("", AutoRegistrationN1.class).plugin); assertEquals("AutoRegistrationN1", container.getComponentInstance("", AutoRegistrationN1.class).plugin.getName()); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN1.class)); assertNull(rootContainer.getComponentInstance("", AutoRegistrationN1.class)); assertNull(rootContainer.getComponentInstanceOfType(AutoRegistrationN1.class)); try { container.getComponentInstance("", AutoRegistrationN2.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstance("", AutoRegistrationN3.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstance("", AutoRegistrationN4.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNull(container.getComponentInstanceOfType(AutoRegistrationN5.class)); try { container.getComponentInstance("", AutoRegistrationN5.class); fail("An exception is expected as the type is not compatible"); } catch (Exception e) { //ok } assertNull(container.getComponentInstance("foo", AutoRegistrationN5.class, false)); assertNotNull(container.getComponentInstance("foo", AutoRegistrationN5.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN5.class)); try { container.getComponentInstance("", AutoRegistrationN5.class); fail("An exception is expected as the type is not compatible"); } catch (Exception e) { //ok } assertNull(container.getComponentInstance("foo2", AutoRegistrationN6.class, false)); assertTrue(container.getComponentInstance("foo2", AutoRegistrationN6.class) instanceof AutoRegistrationN6Type); try { container.getComponentInstance("", AutoRegistrationN7.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstance("foo3", AutoRegistrationN8.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } assertNull(container.getComponentInstance("foo4", AutoRegistrationN9.class, false)); assertTrue(container.getComponentInstance("foo4", AutoRegistrationN9.class) instanceof AutoRegistrationN9); } @Test public void testDefinitionByNameWithProvider() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); container.registerComponentImplementation(AutoRegistrationN1P.class); container.registerComponentImplementation(AutoRegistrationN2P.class); container.registerComponentImplementation(AutoRegistrationN3P.class); container.registerComponentImplementation(AutoRegistrationN4P.class); container.registerComponentImplementation(AutoRegistrationN5P.class); container.registerComponentImplementation(AutoRegistrationN5P2.class); container.registerComponentImplementation(AutoRegistrationN6P.class); container.registerComponentImplementation(AutoRegistrationN7P.class); container.registerComponentImplementation(AutoRegistrationN8P.class); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN1P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN1P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN1P.class).p.get()); assertTrue(container.getComponentInstanceOfType(AutoRegistrationN1P.class).p.get().started); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN1P.class).p.get().plugin); assertEquals("AutoRegistrationN1", container.getComponentInstanceOfType(AutoRegistrationN1P.class).p.get().plugin.getName()); try { container.getComponentInstanceOfType(AutoRegistrationN2P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationN3P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationN4P.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN5P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN5P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN5P.class).p.get()); try { container.getComponentInstanceOfType(AutoRegistrationN5P2.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN6P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationN6P.class).p); assertTrue(container.getComponentInstanceOfType(AutoRegistrationN6P.class).p.get() instanceof AutoRegistrationN6Type); try { container.getComponentInstanceOfType(AutoRegistrationN7P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationN8P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } } @DefinitionByName public static class AutoRegistrationN1 implements Startable { boolean started; ComponentPlugin plugin; public void start() { started = true; } public void stop() { } public void add(ComponentPlugin plugin) { this.plugin = plugin; } } public static class AutoRegistrationN1P { @Inject @Named public Provider<AutoRegistrationN1> p; } @DefinitionByName public static abstract class AutoRegistrationN2 {} public static class AutoRegistrationN2P { @Inject @Named public Provider<AutoRegistrationN2> p; } @DefinitionByName public static interface AutoRegistrationN3 {} public static class AutoRegistrationN3P { @Inject @Named public Provider<AutoRegistrationN3> p; } @DefinitionByName(type = AutoRegistrationN1.class) public static class AutoRegistrationN4 {} public static class AutoRegistrationN4P { @Inject @Named public Provider<AutoRegistrationN4> p; } @DefinitionByName(named = "foo", type = AutoRegistrationN5.class) public static class AutoRegistrationN5 {} public static class AutoRegistrationN5P { @Inject @Named("foo") public Provider<AutoRegistrationN5> p; } public static class AutoRegistrationN5P2 { @Inject @Named public Provider<AutoRegistrationN5> p; } @DefinitionByName(named = "foo2", type = AutoRegistrationN6Type.class) public static interface AutoRegistrationN6 {} public static class AutoRegistrationN6Type implements AutoRegistrationN6 {} public static class AutoRegistrationN6P { @Inject @Named("foo2") public Provider<AutoRegistrationN6> p; } @DefinitionByName(type = AutoRegistrationN7Type.class) public static interface AutoRegistrationN7 {} public static abstract class AutoRegistrationN7Type implements AutoRegistrationN7 {} public static class AutoRegistrationN7P { @Inject @Named public Provider<AutoRegistrationN7> p; } @DefinitionByName(named = "foo3", type = AutoRegistrationN8Type.class) public static interface AutoRegistrationN8 {} public static interface AutoRegistrationN8Type extends AutoRegistrationN8 {} public static class AutoRegistrationN8P { @Inject @Named("foo3") public Provider<AutoRegistrationN8> p; } @DefinitionByName(named = "foo4", target = {RootContainer.class}) public static class AutoRegistrationN9 {} @Test public void testDefinitionByQualifier() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); final RootContainer rootContainer = new ContainerBuilder().withRoot(rootURL).withPortal(portalURL). profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); assertNull(container.getComponentInstanceOfType(AutoRegistrationQ1.class)); assertNull(container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class, false)); assertNotNull(container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class)); assertTrue(container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class).started); assertNotNull(container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class).plugin); assertEquals("AutoRegistrationQ1", container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class). plugin.getName()); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ1.class)); assertNull(rootContainer.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ1.class)); assertNull(rootContainer.getComponentInstanceOfType(AutoRegistrationQ1.class)); try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ2.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ3.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ4.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNull(container.getComponentInstanceOfType(AutoRegistrationQ5.class)); try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ5.class); fail("An exception is expected as the type is not compatible"); } catch (Exception e) { //ok } assertNull(container.getComponentInstance(AutoRegistrationQualifier2.class, AutoRegistrationQ5.class, false)); assertNotNull(container.getComponentInstance(AutoRegistrationQualifier2.class, AutoRegistrationQ5.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ5.class)); try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ5.class); fail("An exception is expected as the type is not compatible"); } catch (Exception e) { //ok } assertNull(container.getComponentInstance(AutoRegistrationQualifier3.class, AutoRegistrationQ6.class, false)); assertTrue(container.getComponentInstance(AutoRegistrationQualifier3.class, AutoRegistrationQ6.class) instanceof AutoRegistrationQ6Type); try { container.getComponentInstance(AutoRegistrationQualifier1.class, AutoRegistrationQ7.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstance(AutoRegistrationQualifier4.class, AutoRegistrationQ8.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } assertNull(container.getComponentInstance(AutoRegistrationBadQualifier.class, AutoRegistrationQ9.class)); assertNull(container.getComponentInstance(AutoRegistrationQualifier4.class, AutoRegistrationQ10.class, false)); assertTrue(container.getComponentInstance(AutoRegistrationQualifier4.class, AutoRegistrationQ10.class) instanceof AutoRegistrationQ10); } @Test public void testDefinitionByQualifierWithProvider() { final URL rootURL = getClass().getResource("empty-config.xml"); final URL portalURL = getClass().getResource("test-exo-container.xml"); assertNotNull(rootURL); assertNotNull(portalURL); new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testAutoRegistration").build(); final ExoContainer container = PortalContainer.getInstance(); container.registerComponentImplementation(AutoRegistrationQ1P.class); container.registerComponentImplementation(AutoRegistrationQ2P.class); container.registerComponentImplementation(AutoRegistrationQ3P.class); container.registerComponentImplementation(AutoRegistrationQ4P.class); container.registerComponentImplementation(AutoRegistrationQ5P.class); container.registerComponentImplementation(AutoRegistrationQ5P2.class); container.registerComponentImplementation(AutoRegistrationQ6P.class); container.registerComponentImplementation(AutoRegistrationQ7P.class); container.registerComponentImplementation(AutoRegistrationQ8P.class); container.registerComponentImplementation(AutoRegistrationQ9P.class); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ1P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ1P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ1P.class).p.get()); assertTrue(container.getComponentInstanceOfType(AutoRegistrationQ1P.class).p.get().started); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ1P.class).p.get().plugin); assertEquals("AutoRegistrationQ1", container.getComponentInstanceOfType(AutoRegistrationQ1P.class).p.get().plugin.getName()); try { container.getComponentInstanceOfType(AutoRegistrationQ2P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationQ3P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationQ4P.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ5P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ5P.class).p); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ5P.class).p.get()); try { container.getComponentInstanceOfType(AutoRegistrationQ5P2.class); fail("An exception is expected as the type is not correct"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ6P.class)); assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ6P.class).p); assertTrue(container.getComponentInstanceOfType(AutoRegistrationQ6P.class).p.get() instanceof AutoRegistrationQ6Type); try { container.getComponentInstanceOfType(AutoRegistrationQ7P.class); fail("An exception is expected as the class is an abstract class"); } catch (Exception e) { // OK } try { container.getComponentInstanceOfType(AutoRegistrationQ8P.class); fail("An exception is expected as the class is an interface"); } catch (Exception e) { // OK } assertNotNull(container.getComponentInstanceOfType(AutoRegistrationQ9P.class)); assertNull(container.getComponentInstanceOfType(AutoRegistrationQ9P.class).p); } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier1.class) public static class AutoRegistrationQ1 implements Startable { boolean started; ComponentPlugin plugin; public void start() { started = true; } public void stop() { } public void add(ComponentPlugin plugin) { this.plugin = plugin; } } public static class AutoRegistrationQ1P { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ1> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier1.class) public static abstract class AutoRegistrationQ2 {} public static class AutoRegistrationQ2P { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ2> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier1.class) public static interface AutoRegistrationQ3 {} public static class AutoRegistrationQ3P { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ3> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier1.class, type = AutoRegistrationQ1.class) public static class AutoRegistrationQ4 {} public static class AutoRegistrationQ4P { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ4> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier2.class, type = AutoRegistrationQ5.class) public static class AutoRegistrationQ5 {} public static class AutoRegistrationQ5P { @Inject @AutoRegistrationQualifier2 public Provider<AutoRegistrationQ5> p; } public static class AutoRegistrationQ5P2 { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ5> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier3.class, type = AutoRegistrationQ6Type.class) public static interface AutoRegistrationQ6 {} public static class AutoRegistrationQ6Type implements AutoRegistrationQ6 {} public static class AutoRegistrationQ6P { @Inject @AutoRegistrationQualifier3 public Provider<AutoRegistrationQ6> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier1.class, type = AutoRegistrationQ7Type.class) public static interface AutoRegistrationQ7 {} public static abstract class AutoRegistrationQ7Type implements AutoRegistrationQ7 {} public static class AutoRegistrationQ7P { @Inject @AutoRegistrationQualifier1 public Provider<AutoRegistrationQ7> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier4.class, type = AutoRegistrationQ8Type.class) public static interface AutoRegistrationQ8 {} public static interface AutoRegistrationQ8Type extends AutoRegistrationQ8 {} public static class AutoRegistrationQ8P { @Inject @AutoRegistrationQualifier4 public Provider<AutoRegistrationQ8> p; } @DefinitionByQualifier(qualifier = AutoRegistrationBadQualifier.class, type = AutoRegistrationQ9Type.class) public static interface AutoRegistrationQ9 {} public static class AutoRegistrationQ9Type implements AutoRegistrationQ9 {} public static class AutoRegistrationQ9P { @Inject @AutoRegistrationBadQualifier public Provider<AutoRegistrationQ9> p; } @DefinitionByQualifier(qualifier = AutoRegistrationQualifier4.class, target = {RootContainer.class}) public static class AutoRegistrationQ10 {} @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface AutoRegistrationQualifier1 { } @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface AutoRegistrationQualifier2 { } @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface AutoRegistrationQualifier3 { } @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface AutoRegistrationQualifier4 { } @Retention(RetentionPolicy.RUNTIME) @Qualifier public static @interface AutoRegistrationQualifier5 { } @Retention(RetentionPolicy.RUNTIME) public static @interface AutoRegistrationBadQualifier { } public static class SerializationRecursivity1 { private SerializationRecursivity2 sr2; public SerializationRecursivity1(InitParams params) { sr2 = (SerializationRecursivity2)params.getObjectParam("SerializationRecursivity2").getObject(); } } public static class SerializationRecursivity2 { @SuppressWarnings("unused") private SerializationRecursivity3 sr3; } public static class SerializationRecursivity3 { } @Test public void testSerializationRecursivity() { URL rootURL = getClass().getResource("test-exo-container.xml"); URL portalURL = getClass().getResource("empty-config.xml"); assertNotNull(rootURL); assertNotNull(portalURL); // new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).profiledBy("testSerializationRecursivity").build(); final RootContainer container = RootContainer.getInstance(); String xmlConfig = container.getConfigurationXML(); SerializationRecursivity1 sr1 = container.getComponentInstanceOfType(SerializationRecursivity1.class); sr1.sr2.sr3 = container.getComponentInstanceOfType(SerializationRecursivity3.class); assertEquals(xmlConfig,container.getConfigurationXML()); final PortalContainer pcontainer = PortalContainer.getInstance(); xmlConfig = pcontainer.getConfigurationXML(); sr1 = container.getComponentInstanceOfType(SerializationRecursivity1.class); sr1.sr2.sr3 = container.getComponentInstanceOfType(SerializationRecursivity3.class); assertEquals(xmlConfig,pcontainer.getConfigurationXML()); } }